1. 程式人生 > 其它 >HTTPS為什麼讓資料傳輸更安全?

HTTPS為什麼讓資料傳輸更安全?

談到HTTPS, 就不得不談到與之相對的HTTP。HTTP的特性是明文傳輸,因此在傳輸的每一個環節,資料都有可能被第三方竊取或者篡改,具體來說,HTTP 資料經過 TCP 層,然後經過WIFI路由器、運營商和目標伺服器,這些環節中都可能被中間人拿到資料並進行篡改,也就是我們常說的中間人攻擊

為了防範這樣一類攻擊,我們不得已要引入新的加密方案,即 HTTPS
HTTPS並不是一個新的協議, 而是一個加強版的HTTP。其原理是在HTTP和TCP之間建立了一箇中間層,當HTTP和TCP通訊時並不是像以前那樣直接通訊,直接經過了一箇中間層進行加密,將加密後的資料包傳給TCP, 響應的,TCP必須將資料包解密,才能傳給上面的HTTP。這個中間層也叫安全層。安全層的核心就是對資料加解密。

接下來我們就來剖析一下HTTPS的加解密是如何實現的。

對稱加密和非對稱加密

概念

首先需要理解對稱加密和非對稱加密的概念,然後討論兩者應用後的效果如何。

對稱加密是最簡單的方式,指的是加密和解密用的是同樣的金鑰

而對於非對稱加密,如果有 A、 B 兩把金鑰,如果用 A 加密過的資料包只能用 B 解密,反之,如果用 B 加密過的資料包只能用 A 解密。

加解密過程

接著我們來談談瀏覽器和伺服器進行協商加解密的過程。

首先,瀏覽器會給伺服器傳送一個隨機數client_random和一個加密的方法列表。

伺服器接收後給瀏覽器返回另一個隨機數server_random和加密方法。

現在,兩者擁有三樣相同的憑證: client_random、server_random和加密方法。

接著用這個加密方法將兩個隨機數混合起來生成金鑰,這個金鑰就是瀏覽器和服務端通訊的暗號。

各自應用效果

如果用對稱加密的方式,那麼第三方可以在中間獲取到client_randomserver_random和加密方法,由於這個加密方法同時可以解密,所以中間人可以成功對暗號進行解密,拿到資料,很容易就將這種加密方式破解了。

既然對稱加密這麼不堪一擊,我們就來試一試非對稱加密。在這種加密方式中,伺服器手裡有兩把鑰匙,一把是公鑰,也就是說每個人都能拿到,是公開的,另一把是私鑰,這把私鑰只有伺服器自己知道。
好,現在開始傳輸。

瀏覽器把client_random和加密方法列表傳過來,伺服器接收到,把server_random

加密方法公鑰傳給瀏覽器。

現在兩者擁有相同的client_random、server_random和加密方法。然後瀏覽器用公鑰將client_randomserver_random加密,生成與伺服器通訊的暗號。

這時候由於是非對稱加密,公鑰加密過的資料只能用私鑰解密,因此中間人就算拿到瀏覽器傳來的資料,由於他沒有私鑰,照樣無法解密,保證了資料的安全性。

這難道一定就安全嗎?聰明的小夥伴早就發現了端倪。回到非對稱加密的定義,公鑰加密的資料可以用私鑰解密,那私鑰加密的資料也可以用公鑰解密呀!

伺服器的資料只能用私鑰進行加密(因為如果它用公鑰那麼瀏覽器也沒法解密啦),中間人一旦拿到公鑰,那麼就可以對服務端傳來的資料進行解密了,就這樣又被破解了。而且,只是採用非對稱加密,對於伺服器效能的消耗也是相當巨大的,因此我們暫且不採用這種方案。

對稱加密和非對稱加密的結合

可以發現,對稱加密和非對稱加密,單獨應用任何一個,都會存在安全隱患。那我們能不能把兩者結合,進一步保證安全呢?
其實是可以的,演示一下整個流程:

1.瀏覽器向伺服器傳送client_random和加密方法列表。
2.伺服器接收到,返回server_random、加密方法以及公鑰。
3.瀏覽器接收,接著生成另一個隨機數pre_random, 並且用公鑰加密,傳給伺服器。(敲黑板!重點操作!)
4.伺服器用私鑰解密這個被加密後的pre_random

現在瀏覽器和伺服器有三樣相同的憑證:client_randomserver_randompre_random。然後兩者用相同的加密方法混合這三個隨機數,生成最終的金鑰。
然後瀏覽器和伺服器儘管用一樣的金鑰進行通訊,即使用對稱加密。
這個最終的金鑰是很難被中間人拿到的,為什麼呢? 因為中間人沒有私鑰,從而拿不到pre_random,也就無法生成最終的金鑰了。
回頭比較一下和單純的使用非對稱加密, 這種方式做了什麼改進呢?本質上是防止了私鑰加密的資料外傳。單獨使用非對稱加密,最大的漏洞在於伺服器傳資料給瀏覽器只能用私鑰加密,這是危險產生的根源。利用對稱和非對稱加密結合的方式,就防止了這一點,從而保證了安全。

新增數字證書

儘管通過兩者加密方式的結合,能夠很好地實現加密傳輸,但實際上還是存在一些問題。黑客如果採用 DNS 劫持,將目標地址替換成黑客伺服器的地址,然後黑客自己造一份公鑰和私鑰,照樣能進行資料傳輸。而對於瀏覽器使用者而言,他是不知道自己正在訪問一個危險的伺服器的。
事實上HTTPS在上述結合對稱和非對稱加密的基礎上,又添加了數字證書認證的步驟。其目的就是讓伺服器證明自己的身份。

傳輸過程

為了獲取這個證書,伺服器運營者需要向第三方認證機構獲取授權,這個第三方機構也叫CA(Certificate Authority), 認證通過後 CA 會給伺服器頒發數字證書。
這個數字證書有兩個作用:

1.伺服器向瀏覽器證明自己的身份。
2.把公鑰傳給瀏覽器。

這個驗證的過程發生在什麼時候呢?
當伺服器傳送server_random、加密方法的時候,順便會帶上數字證書(包含了公鑰), 接著瀏覽器接收之後就會開始驗證數字證書。如果驗證通過,那麼後面的過程照常進行,否則拒絕執行。
現在我們來梳理一下HTTPS最終的加解密過程:

認證過程

瀏覽器拿到數字證書後,如何來對證書進行認證呢?

首先,會讀取證書中的明文內容。CA 進行數字證書的簽名時會儲存一個 Hash 函式,來這個函式來計算明文內容得到資訊A,然後用公鑰解密明文內容得到資訊B,兩份資訊做比對,一致則表示認證合法。
當然有時候對於瀏覽器而言,它不知道哪些 CA 是值得信任的,因此會繼續查詢 CA 的上級 CA,以同樣的資訊比對方式驗證上級 CA 的合法性。一般根級的 CA 會內建在作業系統當中,當然如果向上找沒有找到根級的 CA,那麼將被視為不合法。

總結

HTTPS並不是一個新的協議, 它在HTTP和TCP的傳輸中建立了一個安全層,利用對稱加密和非對稱加密結合數字證書認證的方式,讓傳輸過程的安全性大大提高。

轉載自:https://juejin.cn/post/6844904021308735502#heading-84

作者:熊貓吃西瓜 出處:https://www.cnblogs.com/XF-eng 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連線,否則保留追究法律責任的權利。