發(fā)布時間:2020-9-5 分類: 行業(yè)資訊
首先,HTTPS連接過程和中間人攻擊原理
https協(xié)議是http + ssl協(xié)議,如下圖所示:連接過程:
1.https請求
客戶端向服務(wù)器發(fā)送https請求;
2.生成公鑰和私鑰
服務(wù)器收到請求后,會生成公鑰和私鑰。公鑰相當(dāng)于一個鎖,私鑰相當(dāng)于一個密鑰,只有私鑰才能打開公鑰鎖定的內(nèi)容;
3.返回公鑰
服務(wù)器將公鑰(證書)返回給客戶端。公鑰包含大量信息,如證書的頒發(fā)機(jī)構(gòu),到期時間等;
4.客戶端驗證公鑰
在收到公鑰后,客戶端將首先驗證它是否有效,例如發(fā)布機(jī)構(gòu)或到期時間。如果發(fā)現(xiàn)錯誤,將拋出異常,表明證書存在問題。如果沒有問題,則生成隨機(jī)值作為客戶端密鑰,然后使用服務(wù)器的公鑰進(jìn)行加密;
5.發(fā)送客戶端密鑰
客戶端使用服務(wù)器的公鑰加密密鑰并將其發(fā)送到服務(wù)器。
6.服務(wù)器接收密鑰并對稱加密內(nèi)容
服務(wù)器接收加密密鑰,使用私鑰對其進(jìn)行解密,并獲取客戶端密鑰。然后,服務(wù)器對稱地加密要傳輸?shù)膬?nèi)容和客戶端的密鑰,這樣除非密鑰已知,否則服務(wù)器無法知道。轉(zhuǎn)移的內(nèi)容。
7.加密傳輸
服務(wù)器將加密的內(nèi)容發(fā)送到客戶端。
8.獲取加密內(nèi)容,解密
在客戶端獲得加密內(nèi)容之后,它使用先前生成的密鑰對其進(jìn)行解密以獲得內(nèi)容。
中間人劫持攻擊
Https也不是絕對安全的。下圖顯示了中間人劫持攻擊。中間人可以獲得客戶端和服務(wù)器之間的所有通信內(nèi)容。
HTTPS連接過程和中間人攻擊劫持
中間人攔截客戶端發(fā)送給服務(wù)器的請求,然后假裝客戶端與服務(wù)器通信;由服務(wù)器返回給客戶端的內(nèi)容被發(fā)送到客戶端,假裝服務(wù)器與客戶端通信。
這樣,可以獲得客戶端和服務(wù)器之間的所有通信內(nèi)容。
使用中間人攻擊,客戶端必須信任經(jīng)紀(jì)人的證書。如果客戶端不信任,則攻擊無效。
第二,預(yù)防中間人攻擊
劫持中間人的原因是沒有驗證或驗證服務(wù)器證書和域名。為方便起見,https請求直接由開源框架的默認(rèn)身份驗證方法采用。
如凌空
HTTPS連接過程和中間人攻擊劫持
HTTPS連接過程和中間人攻擊劫持
OKhttp3.0
HTTPS連接過程和中間人攻擊劫持
預(yù)防方法:
有兩種方法可以阻止它
1.對于具有高安全性要求的應(yīng)用程序,您可以使用客戶端的嵌入式證書來鎖定證書。只有當(dāng)客戶端證書和服務(wù)器的證書相同時,才允許通信,例如某些銀行應(yīng)用程序,但此方法面臨問題,證書過期,因為證書具有一定的有效期,當(dāng)嵌入式證書過期時,它可以只能通過強(qiáng)制更新或要求用戶下載證書來解決。
以凌空為例:驗證的實施如下:
使用預(yù)嵌入證書創(chuàng)建SSLSocketFactory;
私有靜態(tài)SSLSocketFactory buildSSLSocketFactory(Context context,
Int certRawResId){
KeyStore keyStore=null;
試試{
keyStore=buildKeyStore(context,certRawResId);
} catch(KeyStoreException e){
e.printStackTrace();
} catch(CertificateException e){
e.printStackTrace();
} catch(NoSuchAlgorithmException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
String tmfAlgorithm=TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf=null;
試試{
Tmf=TrustManagerFactory.getInstance(tmfAlgorithm);
Tmf.init(用于keyStore);
} catch(NoSuchAlgorithmException e){
e.printStackTrace();
} catch(KeyStoreException e){
e.printStackTrace();
}
SSLContext sslContext=null;
試試{
sslContext=SSLContext.getInstance('TLS');
} catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
試試{
sslContext.init(null,tmf.getTrustManagers(),null);
} catch(KeyManagementException e){
e.printStackTrace();
}
返回sslContext.getSocketFactory();
通過ssl校驗和和域名驗證生成連接
HTTPS連接過程和中間人攻擊劫持
HTTPS連接過程和中間人攻擊劫持
2對于通用應(yīng)用程序的安全性要求,您可以使用驗證域名,證書有效性,證書密鑰信息和證書鏈的方法
在volley的情況下,重寫HTTPSTrustManager中的checkServerTrusted方法并啟用強(qiáng)域名驗證
。三,Webview HTTPS安全性
目前,許多應(yīng)用程序使用webview加載H5頁面。如果服務(wù)器使用由受信任CA頒發(fā)的證書,則webViewClient的onReceivedSslError()將在webView.setWebViewClient(webviewClient)中被覆蓋。如果發(fā)生證書錯誤,則直接調(diào)用handler.proceed。將忽略錯誤并繼續(xù)加載帶有問題頁面的證書,如果調(diào)用handler.cancel()可以終止有問題的頁面加載證書,證書有問題,可以提示用戶冒險,讓用戶選擇是否加載,如果需要安全級別更高,可以直接終止頁面加載,提示用戶冒網(wǎng)絡(luò)環(huán)境風(fēng)險:
HTTPS連接過程和中間人攻擊劫持
建議不要直接使用handler.proceed()。如果webview在加載https時需要強(qiáng)烈驗證服務(wù)器證書,則可以使用HttpsURLConnection驗證服務(wù)器證書以驗證onPageStarted()中的證書。如果驗證沒有停止加載網(wǎng)頁。當(dāng)然,這會降低網(wǎng)頁的加載速度,需要進(jìn)一步優(yōu)化。具體的優(yōu)化方法不在本討論范圍內(nèi),此處不再詳述。
« 張澤田的朋友圈回應(yīng)了劉強(qiáng)東的案子:只要家人在一起,就完整了 | Ofo Daiwei被列入“賴來”名單:不能坐車或買房 »
周一周五 8:30 - 18:00