<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么 HTTPS 是安全的?

          共 3151字,需瀏覽 7分鐘

           ·

          2020-10-14 07:15

          來自:https://segmentfault.com/a/1190000023936425
          作者:mokeyWie

          1. HTTP 協(xié)議
          在談論 HTTPS 協(xié)議之前,先來回顧一下 HTTP 協(xié)議的概念。

          1.1 HTTP 協(xié)議介紹

          HTTP 協(xié)議是一種基于文本的傳輸協(xié)議,它位于 OSI 網絡模型中的應用層。

          HTTP 協(xié)議是通過客戶端和服務器的請求應答來進行通訊,目前協(xié)議由之前的 RFC 2616 拆分成立六個單獨的協(xié)議說明(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235),通訊報文如下:

          請求

          POST http://www.baidu.com HTTP/1.1Host: www.baidu.comConnection: keep-aliveContent-Length: 7User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
          wd=HTTP

          響應

          HTTP/1.1 200 OKConnection: Keep-AliveContent-Encoding: gzipContent-Type: text/html;charset=utf-8Date: Thu, 14 Feb 2019 07:23:49 GMTTransfer-Encoding: chunked
          ...

          1.2 HTTP 中間人攻擊

          HTTP 協(xié)議使用起來確實非常的方便,但是它存在一個致命的缺點:不安全。

          我們知道 HTTP 協(xié)議中的報文都是以明文的方式進行傳輸,不做任何加密,這樣會導致什么問題呢?下面來舉個例子:

          小明在 JAVA 貼吧發(fā)帖,內容為我愛JAVA:

          被中間人進行攻擊,內容修改為我愛PHP

          小明被群嘲
          可以看到在 HTTP 傳輸過程中,中間人能看到并且修改 HTTP 通訊中所有的請求和響應內容,所以使用 HTTP 是非常的不安全的。

          1.3 防止中間人攻擊

          這個時候可能就有人想到了,既然內容是明文那我使用對稱加密的方式將報文加密這樣中間人不就看不到明文了嗎,于是如下改造:

          雙方約定加密方式

          使用 AES 加密報文

          這樣看似中間人獲取不到明文信息了,但其實在通訊過程中還是會以明文的方式暴露加密方式和秘鑰,如果第一次通信被攔截到了,那么秘鑰就會泄露給中間人,中間人仍然可以解密后續(xù)的通信:

          那么對于這種情況,我們肯定就會考慮能不能將秘鑰進行加密不讓中間人看到呢?答案是有的,采用非對稱加密,我們可以通過 RSA 算法來實現。
          在約定加密方式的時候由服務器生成一對公私鑰,服務器將公鑰返回給客戶端,客戶端本地生成一串秘鑰(AES_KEY)用于對稱加密,并通過服務器發(fā)送的公鑰進行加密得到(AES_KEY_SECRET),之后返回給服務端,服務端通過私鑰將客戶端發(fā)送的AES_KEY_SECRET進行解密得到AEK_KEY,最后客戶端和服務器通過AEK_KEY進行報文的加密通訊,改造如下:

          可以看到這種情況下中間人是竊取不到用于AES加密的秘鑰,所以對于后續(xù)的通訊是肯定無法進行解密了,那么這樣做就是絕對安全了嗎?
          所謂道高一尺魔高一丈,中間人為了對應這種加密方法又想出了一個新的破解方案,既然拿不到AES_KEY,那我就把自己模擬成一個客戶端和服務器端的結合體,在用戶->中間人的過程中中間人模擬服務器的行為,這樣可以拿到用戶請求的明文,在中間人->服務器的過程中中間人模擬客戶端行為,這樣可以拿到服務器響應的明文,以此來進行中間人攻擊:


          這一次通信再次被中間人截獲,中間人自己也偽造了一對公私鑰,并將公鑰發(fā)送給用戶以此來竊取客戶端生成的AES_KEY,在拿到AES_KEY之后就能輕松的進行解密了。
          中間人這樣為所欲為,就沒有辦法制裁下嗎,當然有啊,接下來我們看看 HTTPS 是怎么解決通訊安全問題的。

          2. HTTPS 協(xié)議

          2.1 HTTPS 簡介

          HTTPS 其實是SSL+HTTP的簡稱,當然現在SSL基本已經被TLS取代了,不過接下來我們還是統(tǒng)一以SSL作為簡稱,SSL協(xié)議其實不止是應用在HTTP協(xié)議上,還在應用在各種應用層協(xié)議上,例如:FTP、WebSocket。
          其實SSL協(xié)議大致就和上一節(jié)非對稱加密的性質一樣,握手的過程中主要也是為了交換秘鑰,然后再通訊過程中使用對稱加密進行通訊,大概流程如下:


          這里我只是畫了個示意圖,其實真正的 SSL 握手會比這個復雜的多,但是性質還是差不多,而且我們這里需要關注的重點在于 HTTPS 是如何防止中間人攻擊的。
          通過上圖可以觀察到,服務器是通過 SSL 證書來傳遞公鑰,客戶端會對 SSL 證書進行驗證,其中證書認證體系就是確保SSL安全的關鍵,接下來我們就來講解下CA 認證體系,看看它是如何防止中間人攻擊的。

          2.2 CA 認證體系

          上一節(jié)我們看到客戶端需要對服務器返回的 SSL 證書進行校驗,那么客戶端是如何校驗服務器 SSL 證書的安全性呢。

          權威認證機構

          在 CA 認證體系中,所有的證書都是由權威機構來頒發(fā),而權威機構的 CA 證書都是已經在操作系統(tǒng)中內置的,我們把這些證書稱之為CA根證書:

          簽發(fā)證書

          我們的應用服務器如果想要使用 SSL 的話,需要通過權威認證機構來簽發(fā)CA證書,我們將服務器生成的公鑰和站點相關信息發(fā)送給CA簽發(fā)機構,再由CA簽發(fā)機構通過服務器發(fā)送的相關信息用CA簽發(fā)機構進行加簽,由此得到我們應用服務器的證書,證書會對應的生成證書內容的簽名,并將該簽名使用CA簽發(fā)機構的私鑰進行加密得到證書指紋,并且與上級證書生成關系鏈。

          這里我們把百度的證書下載下來看看:

          可以看到百度是受信于GlobalSign G2,同樣的GlobalSign G2是受信于GlobalSign R1,當客戶端(瀏覽器)做證書校驗時,會一級一級的向上做檢查,直到最后的根證書,如果沒有問題說明服務器證書是可以被信任的。
          如何驗證服務器證書
          那么客戶端(瀏覽器)又是如何對服務器證書做校驗的呢,首先會通過層級關系找到上級證書,通過上級證書里的公鑰來對服務器的證書指紋進行解密得到簽名(sign1),再通過簽名算法算出服務器證書的簽名(sign2),通過對比sign1和sign2,如果相等就說明證書是沒有被篡改也不是偽造的。


          這里有趣的是,證書校驗用的 RSA 是通過私鑰加密證書簽名,公鑰解密來巧妙的驗證證書有效性。

          這樣通過證書的認證體系,我們就可以避免了中間人竊取AES_KEY從而發(fā)起攔截和修改 HTTP 通訊的報文。

          總結

          首先先通過對 HTTP 中間人攻擊的來了解到 HTTP 為什么是不安全的,然后再從安全攻防的技術演變一直到 HTTPS 的原理概括,希望能讓大家對 HTTPS 有個更深刻的了解。


          回復下方「關鍵詞」,獲取優(yōu)質資源

          回復關鍵詞「python」,立即獲取進階必備書籍Python進階》電子版
          回復關鍵詞「Flask」,立即獲取Flask?教程
          回復關鍵詞「wx」,加入高質量python交流群


          推薦:
          1. 微信又雙叒叕更新了一堆功能,哪個對你有用?

          2. Window XP 源碼泄露!網友發(fā)現隱藏功能和趣味細節(jié)

          3. 關于Python3.9,看這張「新特性必知圖」


          長按關注公眾號
          每天分享python技術干貨

          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费播放黄色片网站 | 豆花成人在线视频 | 青青草在线视频黄色 | 久久三级片成年人 | 77777_亚洲午夜久久多人 |