都在談論的 HTTPS,究竟它是如何保護數據傳輸安全的呢?

HTTPS 的應用越來越多,也被大家更多的提及,關于它的運作機制,和大家聊一聊。

HTTPS

隨著互聯網整體的發展, HTTPS 也被越來越多的應用。 甚至蘋果去年還曾經放言要強制所有的 APP 都使用 HTTPS,可見在如今的互聯網它的重要性。

那么問題來了,為什么這么多大公司都在積極推進 HTTPS 呢,它和我們平時更多使用的 HTTP 協議究竟有什么區別呢? 我用最簡單的話語跟大家聊一聊。

HTTP 明文傳輸

先從 HTTP 說起,我們過去使用的 HTTP 協議,最大的問題就是,它是明文傳輸的。因為當時的互聯網還只是簡單的信息發布,所以明文傳輸在那個時代并沒有太大問題。但隨著網絡應用越來越復雜,簡單的明文傳輸所帶來的問題就顯現出來了。

其中一個最突出的問題就是信息劫持。什么叫做劫持呢?簡單來說,以我們現在所使用的互聯網架構,在發送和接受一條網絡請求時,并不是直接發送到目標主機的,而是要經過中間很多個路由器,才能到達主機。

因為 HTTP 是明文傳輸的,那么所有中間經過的路由器都可以看到你的信息,還可以修改你的信息。假如你請求一個網站,網站的主機給你返回它的主頁,一段 HTML 信息:

<html>
    <title>Hello</title>
    <body>
        Hello world.
    </body>
</html>

網站服務器發回給用戶的這個信息不是直接到達他機器的,在這中間要經過很多路由器,如果中途經過的某個路由器使壞,對這條信息做了修改, 然后把修改后的內容轉發給下一個路由器:

<html>
    <title>Hello</title>
    <body>
        Hello world.
        <ad>這是一條廣告</ad>
    </body>
</html>

比如像上面這樣,最終傳輸到用戶設備上的主頁就被惡意加入了一條廣告。 而這一切,對用戶來說是毫無感知的,這就是信息劫持的一個例子。像這種注入廣告還算比較輕微的。如果更嚴重的甚至會竊取你的個人信息。

HTTPS 如何解決

既然說明了 HTTP 的這個問題,那么我們就再來看看 HTTPS 是如何解決這個問題的。由于篇幅原因,我們只用最簡單的語言描述,背后的原理和機制如果都講清楚就需要比較大的篇幅了。

如果讓我們來想,保證信息傳輸不被惡意篡改的話,會用什么方法呢? 最容易想到的應該就是對信息進行加密后再傳輸了。其實 HTTPS 也是基于這個原理的, 只是機制更加完善。

先來從加密說起,常用的加密算法有對稱加密和非對稱加密。對稱加密就是用一個秘鑰,進行加密和解密。 非對稱加密就是加密的時候用一個秘鑰,解密的時候用另一個秘鑰。

從我這個描述上來看,是不是非對稱加密會更安全一些呢? 那為什么還會有對稱加密的存在呢? 因為性能。非對稱加密要比對稱加密更加消耗計算性能。

使用加密算法可以加強傳輸過程的安全性,但單純的加密還是不夠的。為什么這么說呢,如果你開發的是一個 APP 客戶端,這樣的設計勉強夠用,在你的服務器和客戶端上面用同樣的秘鑰對信息加密和解密就可以讓傳輸安全得到很大的提升。但你要保護好你的秘鑰,不被泄露。

但如果你開發的是一個 Web 程序,那這種機制幾乎就沒辦法使用了。因為訪問你服務的是瀏覽器,而不是受你控制的客戶端。你沒有辦法讓一個通用瀏覽器來適配你服務器的特殊加密規則。所以這時候就需要一個更加標準化的傳輸加密協議,也就是 HTTPS 了。

HTTPS 實現原理

HTTPS 相比于普通的加密傳輸,最根本的區別就是用于加密傳輸內容的秘鑰是隨機的。但 HTTPS 是怎么做到的呢? 總部能把秘鑰直接發送給對方吧,因為只要發送,就可能被中間路由器截獲。秘鑰如果被截獲,整個加密算法也就沒有意義了。

HTTPS 使用了更聰明的做法,引入了一個叫做數字證書的機制。簡單來說,每個支持 HTTPS 的服務端,都會申請一個 SSL 證書。這個證書一般是從專業的證書頒發機構申請。

我們平時方位 HTTPS 網站的時候,瀏覽器地址欄一般會出現一個小鎖頭,點擊這個小鎖頭就可以查看證書信息, 我們來看 google 的證書:

它的證書頒發機構是 GeoTrust。 為什么一定要從這些頒發機構申請證書呢? 原因是 HTTPS 的證書鏈校驗機制。比如我們請求 google 的網站,它會先把證書信息發給我們的客戶端。 然后我們客戶端會做一個叫做證書鏈校驗的操作。

所謂證書鏈校驗,其實就是這樣,每個證書都包含一個數字簽名,用這個數字簽名經過一系列算法,就可以匹配到上一級證書的簽名,按照這個算法一直往上延伸,就可以匹配到最頂層證書的簽名。就像上面 google 那個證書的截圖一樣,證書是一級一級的樹形結構。

匹配到最頂層證書有什么用呢? 答案是我們的客戶端會預置這些頂層證書,比如打開你的 mac 電腦的鑰匙串程序,你會看到這樣的內容:

我們平時使用的設備都會預置這些證書頒發機構的根證書。還回到前面討論的證書校驗的討論,當逐級網上找到根證書后,就會和我們預置的這些證書進行匹配,如果能找到相同的,就代表網站發給我們的證書是可信的。否則這個網站就不可信。

這就解釋了為什么我們需要從證書頒發機構申請證書了,因為只有證書頒發機構才可以生成它們根證書下面的子證書,生成子證書需要私鑰,只有證書頒發機構才有自己的私鑰。

說了這么多證書,到底數字證書有什么用呢? 它的作用其中一個是標識網站的身份,這個我們稍后會再詳細介紹。

交換秘鑰

如果證書驗證通過了,就會開始一個交換秘鑰的過程。 服務端發給客戶端的證書,除了包含上述的驗證信息,還包含了證書的公鑰。 客戶端驗證證書有效后,就會發送給服務端一條消息,表明當前客戶端可以接受的加密算法等信息,這條信息使用證書給我們的公鑰加密傳輸。

服務端接收到這條消息后,因為它擁有證書的私鑰,所以它可以用私鑰將信息解密出來。因為私鑰不會傳輸,所以只要不發生其他方式的泄露,理論上只有服務端才可能對這條消息解密。 保證了這條消息的安全性。

服務端知道客戶端可以接受哪些加密算法后,就會生成一個針對這些算法的對稱秘鑰,是的,對稱秘鑰。然后再用自己的私鑰把對稱秘鑰加密后返回給客戶端。

同樣,客戶端得到這條消息,還會用之前收到的證書公鑰再解密,得到這個對稱秘鑰。 到此為止 HTTPS 的握手過程就完成了。

接下來,客戶端就可以用這個對稱秘鑰給服務端發送消息了。

流程梳理

上面說了這么多,大家或許會有疑惑,再一起梳理一下。 HTTPS 在交換證書和秘鑰信息的時候,使用的是非對稱加密。 而在真正的信息傳輸時,使用的是對稱加密。

為什么在傳輸信息時使用對稱加密呢,主要還是性能考慮。對于客戶端來說對請求信息進行加解密的開銷還是有限的。但如果到了服務端,著他機器要對它處理的所有請求都進行加解密,就會造成很大的性能開銷了。

這也是為什么都說 HTTPS 的性能要比 HTTP 消耗大的原因了。它額外處理大量的加密和解密的工作。

HTTPS 是如何防止中間路由器劫持的呢? 首先就是證書,因為證書的私鑰是不會傳輸的,所以理論上只有服務端自己才會知道私鑰。只要這個私鑰不被泄露,那么其他的中間人就不可能解密信息。

證書交換的過程無法被解密,那么對稱秘鑰在傳輸過程中就不會被破解。所以在傳輸信息的時候就可以保證信息的安全了。

當然, HTTPS 并不是絕對安全的。比如我們上面說的,如果服務端自己的證書私鑰被泄露了,那么中間路由器就可以解密你們秘鑰交換時的信息,就可以破解加密傳輸了。

更嚴重的是,根證書的秘鑰被泄露。 根證書的秘鑰都是保存在證書頒發機構手中。如果這些秘鑰被泄露,就可以用它們隨意簽發合法的子證書,這樣中間路由器就可以根本不用轉發你的請求,直接返回給你任何惡意信息,而這時候你完全感知不到。

根證書秘鑰泄露的事情在現實中確實發生過,所以大家選一個靠譜的證書簽發機構,也是保護自己信息傳輸安全的必備行動。關于 HTTPS 就跟大家聊這么多,我這里說的肯定不是最詳細的,但如果你從未了解過這些機制,應該會對你有些用處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容