<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

    我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
    posts - 494, comments - 13, trackbacks - 0, articles - 1

    本文由ELab技術團隊分享,原題“探秘HTTPS”,有修訂和改動。

    1、引言

    對于IM開發者來說,IM里最常用的通信技術就是Socket長連接和HTTP短連接(通常一個主流im會是這兩種通信手段的結合)。從通信安全的角度來說,Socket長連接的安全性,就是基于SSL/TLS加密的TCP協議來實現的(比如微信的mmtls,見《微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解);而對于HTTP短連接的安全性,也就是HTTPS了。

    到底什么是HTTPS?為什么要用HTTPS?今天就借此機會,跟大家一起深入學習一下HTTPS的相關知識,包括HTTP的發展歷程、HTTP遇到的問題、對稱與非對稱加密算法、數字簽名、第三方證書頒發機構等概念。

    學習交流:

    - 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM

    - 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK 

    本文已同步發布于:http://www.52im.net/thread-3897-1-1.html

    2、系列文章

    本文是IM通訊安全知識系列文章中的第9篇,此系列總目錄如下:

    3、寫在前面

    說到HTTPS,那就得回到HTTP協議。

    對于HTTP協議,大家肯定都熟得不能再熟了。那么HTTPS和HTTP的區別大家了解嗎?

    對于這個經典的面試題,大部分人會這么回答:

    • 1)HTTPS比HTTP多了一個S(Secure):也就是說HTTPS是安全版的HTTP;
    • 2)端口號不同:HTTP使用80端口,HTTPS使用443端口;
    • 3)加密算法:HTTPS用的是非對稱加密算法。

    上面的回答能給幾分?等看完本文我們可以再回頭來看下這個回答。

    那么,HTTPS是如何實現安全的短連接數據傳輸呢?想徹底搞明白這個問題,還是要從HTTP的發展歷程說起 ......

    4、HTTP協議回顧

    4.1 基礎常識

    HTTP是Hypertext Transfer Protocal 的縮寫,中文全稱是超文本傳輸協議(詳見《深入淺出,全面理解HTTP協議)。

    通俗了解釋就是:

    • 1)超文本是指包含但不限于文本外的圖片、音頻、視頻等多媒體資源;
    • 2)協議是通信雙方約定好的數據傳輸格式以及通信規則。

    HTTP是TCP/IP協議簇的最高層——應用層協議:

    瀏覽器和服務器在使用HTTP協議相互傳遞超文本數據時,將數據放入報文體內,同時填充首部(請求頭或響應頭)構成完整HTTP報文并交到下層傳輸層,之后每一層加上相應的首部(控制部分)便一層層的下發,最終由物理層將二進制數據以電信號的形式發送出去。

    HTTP的請求如下圖所示:

    HTTP報文結構如下:

    4.2 發展歷程

    HTTP的發展歷程如下:

    由HTTP的發展歷程來看,最開始版本的HTTP(HTTP1.0)在每次建立TCP連接后只能發起一次HTTP請求,請求完畢就釋放TCP連接。

    我們都知道TCP連接的建立需要經過三次握手的過程,而每次發送HTTP請求都需要重新建立TCP連接,毫無疑問是很低效的。所以HTTP1.1改善了這一點,使用長連接的機制,也就是“一次TCP連接,N次HTTP請求”。

    HTTP協議的長連接和短連接,實質上是 TCP 協議的長連接和短連接。

    在使用長連接的情況下,當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經建立的連接。Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。實現長連接需要客戶端和服務端都支持長連接。

    PS:對于IM開發者來說,為了與Socket長連接通道區分,通常認為HTTP就是“短連接”雖然這個“短連接”不一定真的“短”)。

    HTTP1.0若要開啟長連接,需要加上Connection: keep-alive請求頭。有關HTTP協議的詳細發展歷程可閱讀《一文讀懂HTTP協議的歷史演變和設計思路》一文。

    4.3 安全問題

    隨著HTTP越來越廣泛的使用,HTTP的安全性問題也逐漸暴露。

    回憶一下多年前遍地都是的運營商劫持,當你訪問一個本來很正常的網頁,但頁面上卻莫名其妙出現了一些廣告標簽、跳轉腳本、欺騙性的紅包按鈕,甚至有時候本來要下載一個文件,最后下載下來卻變成了另外一個完全不同的東西,這些都是被運營商劫持了HTTP明文數據的現象。

    下圖就是似曾相識的運營商劫持效果圖:

    PS:關于運營商劫持問題,可以詳細閱讀《全面了解移動端DNS域名劫持等雜癥:原理、根源、HttpDNS解決方案等》。

    HTTP主要有以下3點安全性問題:

     

    歸納一下就是:

    • 1)數據保密性問題:因為HTTP無狀態,而且又是明文傳輸,所有數據內容都在網絡中裸奔,包用戶括身份信息、支付賬號與密碼。這些敏感信息極易泄露造成安全隱患;
    • 2)數據完整性問題:HTTP數據包在到達目的主機前會經過很多轉發設備,每一個設備節點都可能會篡改或調包信息,無法驗證數據的完整性;
    • 3)身份校驗問題:有可能遭受中間人攻擊,我們無法驗證通信的另一方就是我們的目標對象。

    因此,為了保證數據傳輸的安全性,必須要對HTTP數據進行加密。

    5、常見的加密方式

    5.1 基本情況

    常見的加密方式分為三種:

    • 1)對稱加密;
    • 2)非對稱加密;
    • 3)數字摘要。

    前兩種適合數據傳輸加密,而數字摘要不可逆的特性常被用于數字簽名。

    接下來,我們逐一簡要學習一下這三種常見的加密方法。

    5.2 對稱加密

    對稱加密也稱為密鑰加密或單向加密,就是使用同一套密鑰來進行加密和解密。密鑰可以理解為加密算法。

    對稱加密圖示如下:

    廣泛使用的對稱加密有:

    對稱加密算法的優缺點和適用場景:

    • 1)優點:算法公開、簡單,加密解密容易,加密速度快,效率高;
    • 2)缺點:相對來說不算特別安全,只有一把鑰匙,密文如果被攔截,且密鑰也被劫持,那么,信息很容易被破譯;
    • 3)適用場景:加解密速度快、效率高,因此適用于大量數據的加密場景。由于如何傳輸密鑰是較為頭痛的問題,因此適用于無需進行密鑰交換的場景,如內部系統,事先就可以直接確定密鑰。

    PS:可以在線體驗對稱加密算法,鏈接是:http://www.jsons.cn/textencrypt/

    小知識:base64編碼也屬于對稱加密哦!

    5.3 非對稱加密

    非對稱加密使用一對密鑰(公鑰和私鑰)進行加密和解密。

    非對稱加密可以在不直接傳遞密鑰的情況下,完成解密,具體步驟如下:

    • 1)乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的;
    • 2)甲方獲取乙方的公鑰,然后用它對信息加密;
    • 3)乙方得到加密后的信息,用私鑰解密。

    以最典型的非對稱加密算法RSA為例,舉個例子:

    想要徹底搞懂RSA,需要了解數論的知識,全部推導過程RSA加密算法。簡單介紹思路:使用兩個超大質數以及其乘積作為生成公鑰和私鑰的材料,想要從公鑰推算出私鑰是非常困難的(需要對超大數因式分解為兩個很大質數的乘積)。目前被破解的最長RSA密鑰是768個二進制位。也就是說,長度超過768位的密鑰,還無法破解(至少沒人公開宣布)。因此可以認為,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。

    非對稱加密算法的優缺點和適用場景:

    • 1)優點:強度高、安全性強于對稱加密算法、無需傳遞私鑰導致沒有密鑰泄露風險;
    • 2)缺點:計算量大、速度慢;
    • 3)適用場景:適用于需要密鑰交換的場景,如互聯網應用,無法事先約定密鑰。

    實踐應用過程中,其實可以與對稱加密算法結合:

    • 1)利用非對稱加密算法安全性較好的特點來傳遞對稱加密算法的密鑰。
    • 2)利用對稱加密算法加解密速度快的特點,進行數據內容比較大的加密場景的加密(如HTTPS)。

    PS:對于IM開發者來說,《探討組合加密算法在IM中的應用》一文值得一讀。

    5.4 如何選擇?

    1)如果選擇對稱加密:

    HTTP請求方使用對稱算法加密數據,那么為了接收方能夠解密,發送方還需要把密鑰一同傳遞到接收方。在傳遞密鑰的過程中還是可能遭到嗅探攻擊,攻擊者竊取密鑰后依然可以解密從而得到發送的數據,所以這種方案不可行。

    2)如果選擇非對稱加密:

    接收方保留私鑰,把公鑰傳遞給發送方。發送方用公鑰來加密數據,接收方使用私鑰解密數據。攻擊者雖然不能直接獲取這些數據(因為沒有私鑰),但是可以通過攔截傳遞的公鑰,然后把自己的公鑰傳給發送方,再用自己的私鑰對發送方發送數據進行解密。

    整個過程通信雙方都不知道中間人的存在,但是中間人能夠獲得完整的數據信息。

    3)兩種加密方法的混合:

    先使用非對稱加密算法加密并傳遞對稱加密的密鑰,然后雙方通過對稱加密方式加密要發送的數據。看起來沒什么問題,但事實是這樣嗎?

    中間人依然可以攔截公鑰的傳遞,并以自己的公鑰作為替換,治標不治本。

    想要治本,就要找到一個第三方公證人來證明公鑰沒有被替換,因此就引出了數字證書的概念,這也是下一節將分享的內容。

    6、數字證書

    6.1 CA機構

    CA就是 Certificate Authority,即頒發數字證書的機構。

    作為受信任的第三方,CA承擔公鑰體系中公鑰的合法性檢驗的責任。

    證書就是源服務器向可信任的第三方機構申請的數據文件。這個證書除了表明這個域名是屬于誰的,頒發日期等,還包括了第三方證書的私鑰。

    服務器將公鑰放在數字證書中,只要證書是可信的,公鑰就是可信的。

    下面兩圖是飛書域名的證書中部分內容的信:

    6.2 數字簽名

    摘要算法:一般用哈希函數來實現,可以理解成一種定長的壓縮算法,它能把任意長度的數據壓縮到固定長度。這好比是給數據加了一把鎖,對數據有任何微小的改動都會使摘要變得截然不同。

    通常情況下:數字證書的申請人(服務器)將生成由私鑰和公鑰以及證書請求文件(Certificate Signing Request,CSR)組成的密鑰對。CSR是一個編碼的文本文件,其中包含公鑰和其他將包含在證書中的信息(例如:域名、組織、電子郵件地址等)。密鑰對和CSR生成通常在將要安裝證書的服務器上完成,并且 CSR 中包含的信息類型取決于證書的驗證級別。與公鑰不同,申請人的私鑰是安全的,永遠不要向 CA(或其他任何人)展示。

    生成 CSR 后:申請人將其發送給 CA,CA 會驗證其包含的信息是否正確,如果正確,則使用頒發的私鑰對證書進行數字簽名,然后將簽名放在證書內隨證書一起發送給申請人。

    在SSL握手階段:瀏覽器在收到服務器的證書后,使用CA的公鑰進行解密,取出證書中的數據、數字簽名以及服務器的公鑰。如果解密成功,則可驗證服務器身份真實。之后瀏覽器再對數據做Hash運算,將結果與數字簽名作對比,如果一致則可以認為內容沒有收到篡改。

    對稱加密和非對稱加密是公鑰加密、私鑰解密, 而數字簽名正好相反——是私鑰加密(簽名)、公鑰解密(驗證),如下圖所示。

    限于篇幅,關于數字證書的內容本文就不再贅述,想詳細了解的可以閱讀:

    7、為什么要使用HTTPS

    圖解HTTP》一書中提到HTTPS就是身披SSL外殼的HTTP。

    7.1 SSL

    SSL 在1999年被更名為TLS

    所以說:HTTPS 并不是一項新的應用層協議,只是 HTTP 通信接口部分由 SSL 和 TLS 替代而已。

    具體就是:HTTP 會先直接和 TCP 進行通信,而HTTPS 會演變為先和 SSL 進行通信,然后再由 SSL 和 TCP 進行通信。

    SSL是一個獨立的協議,不只有 HTTP 可以使用,其他應用層協議也可以使用,比如FTP、SMTP都可以使用SSL來加密。

    7.2 HTTPS請求流程

    HTTPS請求全流程如下圖:

    如上圖所示:

    • 1)用戶在瀏覽器發起HTTPS請求,默認使用服務端的443端口進行連接;
    • 2)HTTPS需要使用一套CA 數字證書,證書內會附帶一個服務器的公鑰Pub,而與之對應的私鑰Private保留在服務端不公開;
    • 3)服務端收到請求,返回配置好的包含公鑰Pub的證書給客戶端;
    • 4)客戶端收到證書,校驗合法性,主要包括是否在有效期內、證書的域名與請求的域名是否匹配,上一級證書是否有效(遞歸判斷,直到判斷到系統內置或瀏覽器配置好的根證書),如果不通過,則顯示HTTPS警告信息,如果通過則繼續;
    • 5)客戶端生成一個用于對稱加密的隨機Key,并用證書內的公鑰Pub進行加密,發送給服務端;
    • 6)服務端收到隨機Key的密文,使用與公鑰Pub配對的私鑰Private進行解密,得到客戶端真正想發送的隨機Key;
    • 7)服務端使用客戶端發送過來的隨機Key對要傳輸的HTTP數據進行對稱加密,將密文返回客戶端;
    • 8)客戶端使用隨機Key對稱解密密文,得到HTTP數據明文;
    • 9)后續HTTPS請求使用之前交換好的隨機Key進行對稱加解密。

    7.3 HTTPS到底解決了什么問題

    HTTPS確實解決了HTTP的三個安全性問題:

    • 1) 保密性:結合非對稱加密和對稱加密實現保密性。用非對稱加密方式加密對稱加密的秘鑰,再用對稱加密方式加密數據;
    • 2) 完整性:通過第三方CA的數字簽名解決完整性問題;
    • 3) 身份校驗:通過第三方CA的數字證書驗證服務器的身份。

    7.4 HTTPS優缺點

    最后我們總結一下HTTPS的優缺點:

    可以看到:HTTPS的確是當今安全傳輸HTTP的最優解,但他并不是完美的,仍會有漏洞。

    8、參考資料

    [1] 深入淺出,全面理解HTTP協議

    [2] HTTP協議必知必會的一些知識

    [3] 從數據傳輸層深度解密HTTP

    [4] 一文讀懂HTTP協議的歷史演變和設計思路

    [5] 你知道一個TCP連接上能發起多少個HTTP請求嗎?

    [6] 如果這樣來理解HTTPS,一篇就夠了

    [7] 一分鐘理解 HTTPS 到底解決了什么問題

    [8] 你知道,HTTPS用的是對稱加密還是非對稱加密?

    [9] HTTPS時代已來,打算更新你的HTTP服務了嗎?

    [10] 一篇讀懂HTTPS:加密原理、安全邏輯、數字證書等

    [11] 全面了解移動端DNS域名劫持等雜癥:原理、根源、HttpDNS解決方案等

    (本文已同步發布于:http://www.52im.net/thread-3897-1-1.html



    作者:Jack Jiang (點擊作者姓名進入Github)
    出處:http://www.52im.net/space-uid-1.html
    交流:歡迎加入即時通訊開發交流群 215891622
    討論:http://www.52im.net/
    Jack Jiang同時是【原創Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
    本博文 歡迎轉載,轉載請注明出處(也可前往 我的52im.net 找到我)。


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 色噜噜狠狠色综合免费视频| 亚洲午夜一区二区电影院| 亚洲熟妇丰满xxxxx| 国产乱码免费卡1卡二卡3卡| 亚洲色成人网一二三区| 在免费jizzjizz在线播| 亚洲成人黄色在线观看| 免费下载成人电影| 亚洲熟妇无码一区二区三区| 天天摸夜夜摸成人免费视频| 久久亚洲AV成人无码国产电影| 在线观看91精品国产不卡免费| 野花视频在线官网免费1| 亚洲成A人片在线观看中文| 一区二区三区免费电影| 久久精品国产精品亚洲精品| 99精品热线在线观看免费视频| 亚洲成人一级电影| 波多野结衣久久高清免费| 一道本不卡免费视频| 亚洲精品白浆高清久久久久久| 久久这里只精品99re免费| 亚洲一级毛片在线播放| 免费无码看av的网站| 一个人免费播放在线视频看片| 亚洲国产精品免费视频| 99精品全国免费观看视频| 特级毛片免费播放| 亚洲丝袜美腿视频| 日本免费网站在线观看| 久久最新免费视频| 亚洲av无码电影网| 亚洲国产精品成人网址天堂| 一级毛片免费观看| 韩国亚洲伊人久久综合影院| 亚洲成a人片在线观看日本| 在线免费观看中文字幕| 中文字幕乱码免费看电影| 亚洲日韩一区二区一无码| 亚洲日产韩国一二三四区| 免费一本色道久久一区|