<button id="hu96j"><acronym id="hu96j"></acronym></button><dd id="hu96j"><pre id="hu96j"></pre></dd>
        <video id="hu96j"><font id="hu96j"><th id="hu96j"></th></font></video>
          <nav id="hu96j"></nav>
        <tbody id="hu96j"><center id="hu96j"><video id="hu96j"></video></center></tbody>

      1. <dd id="hu96j"><track id="hu96j"></track></dd>

        <dd id="hu96j"></dd>
        <rp id="hu96j"><acronym id="hu96j"></acronym></rp>
      2. <button id="hu96j"></button>

        • 保存到桌面加入收藏設為首頁
        網絡安全

        HTTPS連接過程以及中間人攻擊劫持

        時間:2017-12-06 16:30:56   作者:tanym   來源:IDCSPED   閱讀:36112   評論:0
        內容摘要:如果webview加載https需要強校驗服務端證書,可以在 onPageStarted() 中用 HttpsURLConnection 強校驗證書的方式來校驗服務端證書,如果校驗不通過停止加載網頁。
        一 、HTTPS連接過程及中間人攻擊原理

        https協議就是http+ssl協議,如下圖所示為其連接過程:

        HTTPS連接過程以及中間人攻擊劫持

        1.https請求
        客戶端向服務端發送https請求;
        2.生成公鑰和私鑰
        服務端收到請求之后,生成公鑰和私鑰。公鑰相當于是鎖,私鑰相當于是鑰匙,只有私鑰才能夠打開公鑰鎖住的內容;
        3.返回公鑰
        服務端將公鑰(證書)返回給客戶端,公鑰里面包含有很多信息,比如證書的頒發機構、過期時間等等;
        4.客戶端驗證公鑰
        客戶端收到公鑰之后,首先會驗證其是否有效,如頒發機構或者過期時間等,如果發現有問題就會拋出異常,提示證書存在問題。如果沒有問題,那么就生成一個隨機值,作為客戶端的密鑰,然后用服務端的公鑰加密;
        5.發送客戶端密鑰
        客戶端用服務端的公鑰加密密鑰,然后發送給服務端。
        6.服務端收取密鑰,對稱加密內容
        服務端收到經過加密的密鑰,然后用私鑰將其解密,得到客戶端的密鑰,然后服務端把要傳輸的內容和客戶端的密鑰進行對稱加密,這樣除非知道密鑰,否則無法知道傳輸的內容。
        7.加密傳輸
        服務端將經過加密的內容傳輸給客戶端。
        8.獲取加密內容,解密
        客戶端獲取加密內容后,用之前生成的密鑰對其進行解密,獲取到內容。
        中間人劫持攻擊

        https也不是絕對安全的,如下圖所示為中間人劫持攻擊,中間人可以獲取到客戶端與服務器之間所有的通信內容。

        HTTPS連接過程以及中間人攻擊劫持

        HTTPS連接過程以及中間人攻擊劫持
        中間人截取客戶端發送給服務器的請求,然后偽裝成客戶端與服務器進行通信;將服務器返回給客戶端的內容發送給客戶端,偽裝成服務器與客戶端進行通信。
        通過這樣的手段,便可以獲取客戶端和服務器之間通信的所有內容。
        使用中間人攻擊手段,必須要讓客戶端信任中間人的證書,如果客戶端不信任,則這種攻擊手段也無法發揮作用。
        二、中間人攻擊的預防
        造成中間人劫持的原因是 沒有對服務端證書及域名做校驗或者校驗不完整,為了方便,直接采用開源框架默認的校驗方式進行https請求

        如volley

        HTTPS連接過程以及中間人攻擊劫持


        HTTPS連接過程以及中間人攻擊劫持



        OKhttp3.0

        HTTPS連接過程以及中間人攻擊劫持


        預防方法:
        預防方式有兩種
        1 、針對安全性要求比較高的 app,可采取客戶端預埋證書的方式鎖死證書,只有當客戶端證書和服務端的證書完全一致的情況下才允許通信,如一些銀行類的app,但這種方式面臨一個問題,證書過期的問題,因證書有一定的有效期,當預埋證書過期了,只有通過強制更新或者要求用戶下載證書來解決。

        以volley為例:校驗的實現方式如下


        通過預埋證書創建 SSLSocketFactory;
        private static SSLSocketFactory buildSSLSocketFactory(Context context, 
                                                              int certRawResId) { 
            KeyStore keyStore = null; 
            try { 
                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; 
            try { 
                tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
                tmf.init(keyStore); 
         
            } catch (NoSuchAlgorithmException e) { 
                e.printStackTrace(); 
            } catch (KeyStoreException e) { 
                e.printStackTrace(); 
            } 
         
            SSLContext sslContext = null; 
            try { 
                sslContext = SSLContext.getInstance("TLS"); 
            } catch (NoSuchAlgorithmException e) { 
                e.printStackTrace(); 
            } 
            try { 
                sslContext.init(null, tmf.getTrustManagers(), null); 
            } catch (KeyManagementException e) { 
                e.printStackTrace(); 
            } 
         
            return sslContext.getSocketFactory(); 

        生成 經過ssl校驗及 域名校驗的connection

        HTTPS連接過程以及中間人攻擊劫持


        HTTPS連接過程以及中間人攻擊劫持



        2 針對安全性要求一般的app,可采用通過校驗域名,證書有效性、證書關鍵信息及證書鏈的方式
        以volley為例,重寫HTTPSTrustManager 中的checkServerTrusted 方法,同時開啟域名強校驗
        三、Webview的HTTPS安全
        目前很多應用都用webview加載H5頁面,如果服務端采用的是可信CA頒發的證書,在 webView.setWebViewClient(webviewClient) 時重載 WebViewClient的onReceivedSslError() ,如果出現證書錯誤,直接調用handler.proceed()會忽略錯誤繼續加載證書有問題的頁面,如果調用handler.cancel()可以終止加載證書有問題的頁面,證書出現問題了,可以提示用戶風險,讓用戶選擇加載與否,如果是需要安全級別比較高,可以直接終止頁面加載,提示用戶網絡環境有風險:

        HTTPS連接過程以及中間人攻擊劫持


        不建議直接用handler.proceed()。如果webview加載https需要強校驗服務端證書,可以在 onPageStarted() 中用 HttpsURLConnection 強校驗證書的方式來校驗服務端證書,如果校驗不通過停止加載網頁。當然這樣會拖慢網頁的加載速度,需要進一步優化,具體優化的辦法不在本次討論范圍,這里也不詳細講解了。


        IDCsped 提供最新的IT互聯網資訊,本著分享、傳播的宗旨,我們希望能幫助更多人了解需要的信息!

        部分文章轉載自互聯網、部分是IDCsped原創文章,如果轉載,請注明出處:www.idcsped.com !
        微信號:13430280788  歡迎加微信交流!

        標簽:https劫持  https認證  SSL認證  
        相關評論

        銷售電話:13430280788

        Copyright © 2012-2017 | www.idcsped.com 版權所有

          粵公網安備 44010502001126號  粵ICP備12006439號-1
        Powered by OTCMS V3.61
        日韩欧美永久中文字幕视频
          <button id="hu96j"><acronym id="hu96j"></acronym></button><dd id="hu96j"><pre id="hu96j"></pre></dd>
            <video id="hu96j"><font id="hu96j"><th id="hu96j"></th></font></video>
              <nav id="hu96j"></nav>
            <tbody id="hu96j"><center id="hu96j"><video id="hu96j"></video></center></tbody>

          1. <dd id="hu96j"><track id="hu96j"></track></dd>

            <dd id="hu96j"></dd>
            <rp id="hu96j"><acronym id="hu96j"></acronym></rp>
          2. <button id="hu96j"></button>