1. 程式人生 > >通過一個小故事,理解 HTTPS 工作原理

通過一個小故事,理解 HTTPS 工作原理

本文摘錄參考:

HTTP 協議由於是明文傳送,所以存在三大風險:

  • 1、被竊聽的風險:第三方可以截獲並檢視你的內容
  • 2、被篡改的危險:第三方可以截獲並修改你的內容
  • 3、被冒充的風險:第三方可以偽裝成通訊方與你通訊

HTTP 因為存在以上三大安全風險,所以才有了 HTTPS 的出現。

HTTPS 涉及到了很多概念,比如 SSL/TSL,數字證書、數字簽名、加密、認證、公鑰和私鑰等,比較容易混淆。我們先從一次簡單的安全通訊故事講起吧,其中穿插複習一些密碼學的概念。

一、關於 Bob 與他好朋友通訊的故事

這個故事的原文是:

阮一峰老師也翻譯過:

(不過阮老師裡面沒有很好的區分加密和認證的概念,以及最後 HTTPS 的說明不夠嚴謹,評論區的針對這些問題的討論比較激烈,挺有意思的)

這裡重新敘述一下這個故事:

故事的主人公是 Bob,他有三個好朋友 Pat、Doug 和 Susan。Bob 經常跟他們寫信,因為他的信是明文傳輸的,在傳遞過程可能被人截獲偷窺,也可能被人截獲然後又篡改了,更有可能別人偽裝成 Bob 本人跟他的好朋友通訊,總之是不安全的。他很苦惱,經過一番苦苦探索,誒,他發現電腦保安學裡有一種叫非對稱加密演算法的東東,好像可以幫助他解決這個問題

說明:非對稱加密演算法(RSA)是內容加密的一類演算法,它有兩個祕鑰:公鑰與私鑰。公鑰是公開的鑰匙,所有人都可以知道,私鑰是保密的,只有持有者知道。通過公鑰加密的內容,只能通過私鑰解開。非對稱加密演算法的安全性很高,但是因為計算量龐大,比較消耗效能。

好了,來看看 Bob 是怎麼應用非對稱加密演算法與他的好朋友通訊的:

1、首先 Bob 弄到了兩把鑰匙:公鑰和私鑰;

2、Bob 自己保留下了私鑰,把公鑰複製成三份送給了他的三個好朋友 Pat、Doug 和 Susan;

3、此時,Bob 總算可以安心地和他的好朋友愉快地通訊了。比如 Susan 要和他討論關於去哪吃午飯的事情,Susan 就可以先把自己的內容(明文)首先用 Bob 送給他的公鑰做一次加密,然後把加密的內容傳送給 Bob。Bob 收到信後,再用自己的私鑰解開信的內容;

說明:這其實是電腦保安學裡加密的概念,加密的目的是為了不讓別人看到傳送的內容,加密的手段是通過一定的加密演算法及約定的金鑰進行的(比如上述用了非對稱加密演算法以及 Bob 的公鑰),而解密則需要相關的解密演算法及約定的祕鑰(如上述用了非對稱加密演算法和 Bob 自己的私鑰),可以看出加密是可逆的(可解密的)。

4、Bob 看完信後,決定給 Susan 回一封信。為了防止信的內容被篡改(或者別人偽裝成他的身份跟 Susan 通訊),他決定先對信的內容用 hash 演算法做一次處理,得到一個字串雜湊值,Bob 又用自己的私鑰對雜湊值做了一次加密得到一個簽名,然後把簽名和信(明文的)一起傳送給 Susan;

說明 2:Bob 的內容實質是明文傳輸的,所以這個過程是可以被人截獲和窺探的,但是 Bob 不擔心被人窺探,他擔心的是內容被人篡改或者有人冒充自己跟 Susan 通訊。這裡其實涉及到了電腦保安學中的認證概念,Bob 要向 Susan 證明通訊的對方是 Bob 本人,另外也需要確保自己的內容是完整的。

5、Susan 接收到了 Bob 的信,首先用 Bob 給的公鑰對簽名作了解密處理,得到了雜湊值 A,然後 Susan 用了同樣的 Hash 演算法對信的內容作了一次雜湊處理,得到另外一個雜湊值 B,對比 A 和 B,如果這兩個值是相同的,那麼可以確認信就是 Bob 本人寫的,並且內容沒有被篡改過;

說明:4 跟 5 其實構成了一次完整的通過數字簽名進行認證的過程。數字簽名的過程簡述為:傳送方通過不可逆演算法對內容 text1 進行處理(雜湊),得到的結果值 hash1,然後用私鑰加密 hash1 得到結果值 encry1。對方接收 text1 和 encry1,用公鑰解密 encry1 得到 hash1,然後用 text1 進行同等的不可逆處理得到 hash2,對 hash1 和 hash2 進行對比即可認證傳送方。

6、此時,另外一種比較複雜出現了,Bob 是通過網路把公鑰寄送給他的三個好朋友的,有一個不懷好意的傢伙 Jerry 截獲了 Bob 給 Doug 的公鑰。Jerry 開始偽裝成 Bob 跟 Doug 通訊,Doug 感覺通訊的物件不像是 Bob,但是他又無法確認;

7、Bob 最終發現了自己的公鑰被 Jerry 截獲了,他感覺自己的公鑰通過網路傳輸給自己的小夥伴似乎也是不安全的,不懷好意的傢伙可以截獲這個明文傳輸的公鑰。為此他想到了去第三方權威機構"證書中心"(certificate authority,簡稱 CA)做認證。證書中心用自己的私鑰對 Bob 的公鑰和其它資訊做了一次加密。這樣 Bob 通過網路將數字證書傳遞給他的小夥伴後,小夥伴們先用 CA 給的公鑰解密證書,這樣就可以安全獲取 Bob 的公鑰了。

二、HTTPS 通訊過程

通過 Bob 與他的小夥伴的通訊,我們已經可以大致瞭解一個安全通訊的過程,也可以瞭解基本的加密、解密、認證等概念。HTTPS 就是基於這樣一個邏輯設計的。

首先看看組成 HTTPS 的協議:HTTP 協議和 SSL/TSL 協議。HTTP 協議就不用講了,而 SSL/TSL 就是負責加密解密等安全處理的模組,所以 HTTPS 的核心在 SSL/TSL 上面。整個通訊如下:

  • 1、瀏覽器發起往伺服器的 443 埠發起請求,請求攜帶了瀏覽器支援的加密演算法和雜湊演算法。
  • 2、伺服器收到請求,選擇瀏覽器支援的加密演算法和雜湊演算法。
  • 3、伺服器下將數字證書返回給瀏覽器,這裡的數字證書可以是向某個可靠機構申請的,也可以是自制的。
  • 4、瀏覽器進入數字證書認證環節,這一部分是瀏覽器內建的 TSL 完成的:
    • 4.1 首先瀏覽器會從內建的證書列表中索引,找到伺服器下發證書對應的機構,如果沒有找到,此時就會提示使用者該證書是不是由權威機構頒發,是不可信任的。如果查到了對應的機構,則取出該機構頒發的公鑰。
    • 4.2 用機構的證書公鑰解密得到證書的內容和證書籤名,內容包括網站的網址、網站的公鑰、證書的有效期等。瀏覽器會先驗證證書籤名的合法性(驗證過程類似上面 Bob 和 Susan 的通訊)。簽名通過後,瀏覽器驗證證書記錄的網址是否和當前網址是一致的,不一致會提示使用者。如果網址一致會檢查證書有效期,證書過期了也會提示使用者。這些都通過認證時,瀏覽器就可以安全使用證書中的網站公鑰了。
    • 4.3 瀏覽器生成一個隨機數 R,並使用網站公鑰對 R 進行加密。
  • 5、瀏覽器將加密的 R 傳送給伺服器。
  • 6、伺服器用自己的私鑰解密得到 R。
  • 7、伺服器以 R 為金鑰使用了對稱加密演算法加密網頁內容並傳輸給瀏覽器。
  • 8、瀏覽器以 R 為金鑰使用之前約定好的解密演算法獲取網頁內容。

備註 1:前 5 步其實就是 HTTPS 的握手過程,這個過程主要是認證服務端證書(內建的公鑰)的合法性。因為非對稱加密計算量較大,整個通訊過程只會用到一次非對稱加密演算法(主要是用來保護傳輸客戶端生成的用於對稱加密的隨機數私鑰)。後續內容的加解密都是通過一開始約定好的對稱加密演算法進行的。

備註 2:SSL/TLS 是 HTTPS 安全性的核心模組,TLS 的前身是 SSL,TLS1.0 就是 SSL3.1,TLS1.1 是 SSL3.2,TLS1.2 則是 SSL3.3。 SSL/TLS 是建立在 TCP 協議之上,因而也是應用層級別的協議。其包括 TLS Record Protocol 和 TLS Handshaking Protocols 兩個模組,後者負責握手過程中的身份認證,前者則保證資料傳輸過程中的完整性和私密性。

相關推薦

no