HTTPS比HTTP安全,它的安全在於通信過程被加密。然而加密算法是用對稱加密,也就是說,客戶端和服務端采用一個相同的密鑰。為了讓雙方得到這個密鑰,前期就有一個很重要的工作:協商密鑰。
現在我們簡單模擬一下通信過程:
- 客戶端:hi,我准備跟你(xx.com)建立HTTPS通信。
- 服務端:好的,我就是xx.com,這是我的證書,你驗證一下。
- 客戶端:驗證通過了,你的確是xx.com,我把密鑰發給你,下面的通信咱們就加密了。
- 服務端:s&&(*3u247(
- 客戶端:(&DY&#%%&#
1)重要的過程:https要證明自己是合法的,證書+鏈式驗證
2)數字證書的組成
-
公鑰:Public-Key
-
簽名:Signature(簽名算法)
-
簽名算法: Signature Algorithm: sha256WithRSAEncryption
-
證書頒布機構:Issuer
-
過期時間:Validity
-
其他...
3)簽名算法的簽名、校驗過程
//簽名
sign = RSA_Encrypt(sha256(content), privateKey)
//校驗簽名
sha256_Content = RSA_Decrypt(sign, publicKey)
sha256_Content ?= sha256(content)
-
在非對稱加密體系中,私鑰用來簽名,公鑰用來校驗簽名。
-
-
ROOT必須可靠可信任,並且證書鏈不能斷掉(否則驗證失敗)
4)https的SSL握手過程(在tcp三次握手的基礎上增加的)
-
https在http的三次握手的基礎之上,增加了SSL握手,來保證整個過程中數據傳輸的安全性
-
瀏覽器與網站互相發送加密的握手消息並驗證,目的是為了保證雙方都獲得了一致的密碼,並且可以正常的加密解密數據,為后續真正數據的傳輸做一次測試。
-
流程:
-
客戶端向服務端發送客戶端支持的加密算法、Hash算法
-
服務端選擇合適的加密算法、hash算法,將對應的證書發送給客戶端
-
客戶端驗證證書、生成隨機字符串(用來進行對稱加密)
-
客戶端生成握手信息,使用Hash算法取Hash、使用隨機字符串加密握手信息和握手信息的hash值( 這里之所以要帶上握手信息的HASH是因為,防止信息被篡改。如果信息被篡改,那么服務端接收到信息進行HASH時,就會發現HASH值和客戶端傳回來的不一樣。這里就保證了信息不會被篡改。)
-
服務端接收加密信息,解密得到客戶端的隨機字符串,解密握手信息和握手信息hash值,對握手信息進行hash,對比客戶端傳回來的hash
-
服務端同樣使用隨機字符串加密握手信息和握手信息hash值給客戶端
-
客戶端驗證服務端的握手信息(同樣通過hash值避免被篡改)
-
后續:使用隨機字符串進行加密通信
5)https的防劫持
https://www.jianshu.com/p/13a1b955d095
DNS劫持與內容劫持
- DNS劫持(黑客使用私人服務器與瀏覽器 + 真實服務器 進行連接,作為中間者)一般不會發生,因為黑客需要有CA證書,這個一般不能偽造
- 除非瀏覽器自身信任、接受了黑客的自簽名證書
- 內容劫持:作為一個中間人,你沒有服務器私鑰A,是不能解密客戶端發送的內容的,如果你沒有客戶端自己生成的密鑰B,所以你也不能解密客戶端發過去的內容的。
6)http+https的風險
HTTPS只針對傳輸內容進行加密,保證的是客戶端和網站之間的信息就算被攔截也無法破解。
如果不是全站HTTPS,僅僅只是在登錄頁采用HTTPS,那些HTTP連接的頁面同樣是危險的,從HTTP->HTTPS跳轉依然可能被劫持。國內的部分銀行就是這樣,對安全性的考量還比不上百度,百度早就全站HTTPS了。