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