HTTP的安全缺陷
- 通信內容不加密,導致被竊聽
- 不驗證客戶端和服務端的身份,導致:
- 服務器偽裝
- 響應返回到了其他的客戶端
- 海量惡意連接
- 無法證明報文的完整性,導致:請求和響應內容被篡改,這稱為中間人攻擊
公鑰加密技術
- 使用私鑰加密的內容,使用公鑰解密,反之,使用公鑰加密的內容,使用私鑰解密
- 服務器生成公鑰和私鑰,私鑰自己保存,公鑰對外公開
- 客戶端發送請求之前,使用公鑰進行加密——由於私鑰是服務器私有,即使被截獲也無法解密
- 反過來,服務器發送響應之前:
- 對消息執行hash算法,生成摘要
- 對摘要使用私鑰加密,生成數字簽名
- 將消息和數字信息一起發送到客戶端
- 客戶端用公鑰解密數字簽名,得到摘要
- 客戶端對消息執行hash算法,與摘要比對,驗證消息的真偽
- 如果消息被截獲,摘要被解密,由於沒有私鑰,也就無法生成能用公鑰解密的摘要,這樣就保證了消息的正確性、完整性,以及服務器的真實性。
- 該過程的漏洞在於:如何防止有人篡改公鑰,也就是如何保證公鑰的真實性
- 解決:通過CA(數字證書認證),將服務器公鑰、用到的hash算法、CA機構信息等,通過CA的私鑰加密成數字證書
- 之后服務器發送的消息,都附上數字證書
- 瀏覽器收到數字證書,用CA的公鑰解密,拿到服務器的公鑰
- 再將機構信息與本機機構列表比對,驗證公鑰的真實性
- 如果有人偽造公鑰,甚至獲得了CA的私鑰,其證書中的信息、hash算法等內容也很難與真實網站完全一致。
SSL和HTTPS
- 上述過程僅單向安全,用私鑰加密的信息,也就是服務器發出的信息不安全
- 解決辦法:先用上述流程驗證公鑰的真實性,這個過程稱為握手
- 在客戶端生成隨機對稱密鑰
- 對密鑰用公鑰加密,發送到服務端,這樣就保證了密鑰傳輸的安全性
- 之后全部雙向傳輸都使用對稱密鑰加密解密

HTTPS建立連接的流程
- 上述過程就是SSL
- HTTP+SSL/TLS=HTTPS