開源Linux
回複“讀書”,挑選書籍資料~
我相信大家面試的時候對于 HTTPS 這個問題一定不會陌生,可能你隻能簡單的說一下與 HTTP 的差別,但是真正的原理是否很清楚呢?他到底如何安全?這一篇讓我們用大白話來揭開 HTTPS 的神秘面紗吧!
HTTPS 是什麼
HTTPS 是什麼?答:HTTPS 不就是 HTTP 後面多加了一個 S 嗎?
對這裡的 S 就是指 SSL/TLS(就是一種安全加密協定,想深入了解的同學可以自行百度),HTTPS 是在 HTTP 的基礎上,利用 SSL/TLS 加密資料包。
我們記住兩個主要目的就行:
- 對資料加密
- 驗證網站伺服器身份
HTTPS 怎麼對資料進行加密
我們已經知道 HTTPS 第一個目的是給資料加密,對于資料加密,我們這裡要談到兩種加密方式:
- 對稱加密:所謂對稱就是指兩邊一樣 發送方和接收方都用的同一個密鑰,加密解密都是同一個密鑰從始至終隻需要儲存一個密鑰就行。
- 非對稱加密:發送方和接收方使用一對密鑰,即公鑰和私鑰。一般私鑰是保密不能被洩露的,公鑰可以對外傳播。我們可以用公鑰加密私鑰解密(資料加密) 也可用私鑰加密公鑰解密(簽名下面會解釋)
混合加密:知道了兩種加密方式的優缺點之後,我們的 HTTPS 就很厲害了,它采用兩者混合的加密方式。
不是說對稱加密的密鑰不安全嗎?那我們換一種思路,我們在傳遞過程把我們的對稱加密中的密鑰用非對稱加密的方式去傳遞就好了。
這句話有點繞,我們看上圖:
- 用戶端生成會話秘鑰就是我們對稱加密生成的密鑰。
- 它用公鑰加密之後進行傳遞(這個時候被加密的不是資料 是這個會話秘鑰 等于把鑰匙加密了) 這裡的公鑰就是非對稱加密中的公鑰 他是由伺服器傳遞過去的(對外公開)。
- 服務端用非對稱加密的私鑰去解密 拿到我們的會話秘鑰。
- 用戶端和服務端都能用同一個會話秘鑰進行加解密了。
就算傳輸過程被攻擊者截取到了被加密的會話秘鑰 他沒有伺服器的私鑰是無法得到會話秘鑰的。
整個過程巧妙之處就在于之前我們傳遞的是鑰匙,現在我們傳遞的是保險箱,鑰匙在保險箱裡面,你就算拿到了保險箱,沒有保險箱的鑰匙也拿不到鑰匙。
HTTPS 怎麼驗證網站伺服器身份
HTTPS 第二個目的是對網站伺服器進行真實身份認證,那麼這一點又是怎麼做到的呢?
先來看一個問題,上一步我們已經解決了資料加密的問題,雖然攻擊者無法解密資料,但是他可以篡改資料,我們怎麼知道資料沒被動過呢?
資料被篡改怎麼辦
這個時候就要使用數字簽名了,數字簽名:将原文(部分資料關鍵資訊)先用 Hash 函數生成消息摘要,然後用發送者的私鑰加密生成數字簽名,與原文一起傳送給接收者。
兩個關鍵點:
- Hash 算法計算生成資訊摘要
- 私鑰加密生成數字簽名
用戶端如何校驗數字簽名呢?(利用伺服器私鑰加密,公鑰解密)用戶端收到伺服器發過來的數字簽名之後:
- 用服務端的公鑰去解密數字簽名得到消息摘要 (原始未被篡改的)
- 用 Hash 函數對收到的原文計算生成一個摘要資訊 (可能會被篡改的)
如果兩個資訊摘要一緻,說明資料沒有被篡改。OK,到這裡可能你覺得沒問題了!
其實最後還有一個很關鍵的點是:我們剛剛所有的假設都基于用戶端的公鑰是伺服器傳遞過來的,那如果攻擊者僞造了伺服器的公鑰怎麼辦呢?
伺服器公鑰被篡改怎麼辦
這個時候就要使用數字證書了,數字證書認證機構(CA)處于用戶端與伺服器雙方都可信賴的第三方機構的立場上。
服務端向 CA 申請數字證書,稽核通過後 CA 會向申請者簽發認證檔案-證書,包含以下内容:
拿到數字證書後,伺服器傳遞數字證書給用戶端。
用戶端怎麼校驗數字證書
步驟如下:
- 首先浏覽器讀驗證書中的證書所有者、有效期等資訊進行一一校驗。
- 浏覽器開始查找作業系統中已内置的受信任的證書釋出機構 CA,與伺服器發來的證書中的頒發者 CA 比對,用于校驗證書是否為合法機構頒發。
- 如果找不到,浏覽器就會報錯,說明伺服器發來的證書是不可信任的。如果找到,那麼浏覽器就會從作業系統中取出頒發者 CA 的公鑰,然後對伺服器發來的證書裡面的簽名進行解密。
- 浏覽器使用相同的 Hash 算法根據證書内容計算出資訊摘要,将這個計算的值與證書解密的值做對比。
- 對比結果一緻,則證明伺服器發來的證書合法,沒有被冒充。此時浏覽器就可以讀驗證書中的公鑰,用于後續加密了。