什么是https?
https就是在http的基礎上加了一個TLS層 ,http把數據發給tls,tls經過加密后再下發給tcp。
接收端tcp先把消息tls, tls解密后再返回給http
tls是怎么加密的?
在雙方建立連接的過程中, 客戶端與服務器先用非對稱加密的方式協商出一套密鑰, 然后使用這個密鑰以對稱加密的方式加密通信
什么是對稱加密?
對稱加密就是通信雙方使用同一個密鑰,不同的算法進行加密、解密
經典算法: DES(56 位密鑰,密鑰太短⽽逐漸被棄⽤)、AES(128 位、192 位、256 位密鑰, 現在最流⾏)
對稱加密的致命缺點就是: 通信雙方必須事先知道這個密鑰,但現實網絡中危險無處不在, 如何安全地傳輸密鑰呢
非對稱加密
非對稱加密就是通信雙方使用同一套算法, 用公鑰來加密得到密文, 用私鑰解密得到原數據
在這種模型中, 客戶端和服務器都有一套自己的公鑰/私鑰, 通信開始時, 雙方交換公鑰,
客戶端給服務器發數據時用服務器的公鑰進行加密, 服務器收到后用自己的私鑰解密
同理, 服務器給客戶端發數據時, 用客戶端的公鑰加密, 客戶端收到后再用自己的私鑰解密。
因為公鑰加密后的數據,只有自己的那把私鑰才能解開。 換言之, 客戶端用服務器公鑰加密后的數據, 客戶端自己都無法解開,自然也就防止了數據泄露。
可是網絡中壞人無處不在, 我們知道通信開始時,客戶端和服務器會交換公鑰, 如果這個時候公鑰被人竊取, 那么他雖然不能用公鑰解密通信雙方發出去的數據, 但是卻可以偽造數據,偽裝成客戶端、服務器
為了防止這種攻擊, 數字簽名誕生了
現在,通信雙方發送數據時, 先對原數據進行一次hash算法, 然后對hash值簽名(用自己的私鑰加密),將簽名附加到原數據后面一起發送給對方。 對方收到數據后, 用公鑰解密得到hash值, 然后對收到的數據以相同的方式進行hash算法, 如果得到的hash值相同,就說明信息沒有被篡改。
這里涉及到幾個知識點:
1, 非對稱加密中, 同一對密鑰, 公鑰加密的數據私鑰可以解密, 私鑰加密的數據公鑰也可以解密
2, 為什么不直接對原數據用私鑰加密后傳輸呢? 因為直接這樣操作的話會讓簽名比原數據還要大, 浪費系統資源
3, hash: 目前常用的hash算法有MD5, SHA1, SHA256等, hash不是加密, hash算法是不可逆的
現在再回到Https的問題,
既然非對稱加密+數字簽名已經解決了通信安全的問題, 為什么Https還要用對稱加密來進行通信呢?
因為非對稱加密算法復雜, 如果通信過程中全程使用非對稱加密, 將會非常影響網絡性能
https建立通信的一般過程:
1, 客戶端 發送client hello, header中會包含 可供服務端選擇的TLS版本, 可供服務端選擇的加密套件, 以及一個客戶端隨機數
2, 服務器端收到后, 發送server hello, header中包含服務器端選擇的tls版本,加密套件,以及一個服務器隨機數
3, 服務器端發送服務器證書給客戶端, 一並發送的有: 服務器公鑰,服務器主機名, 證書的簽名,證書簽發機構的公鑰/簽名等。
4, 客戶端收到公鑰后, 對公鑰進行驗證(一方面是合法性驗證, 就是看你這個證書是不是合法機構頒發的, 另一方面是看這個服務器主機名是不是自己想要通信的主機名)
驗證通過后, 客戶端生成另一個隨機數Pre-master secret, 用服務器公鑰加密后發給服務器
接下來客戶端和服務器就可以根據 客戶端隨機數+服務器隨機數+Pre-master secret 來生成master secret
(為什么需要這個Pre-master secret呢? 因為之前的客戶端隨機數和服務器隨機數不是加密傳輸的, 可能被竊取)
這個master secret包含客戶端加密密鑰, 服務端加密密鑰, 客戶端MAC secret, 服務器端MAC secret
(我們之前說對稱加密中, 雙方使用的是同一個密鑰, 那為什么這里要用兩個密鑰呢? 是為了防止一種攻擊, 比如其他人拿到消息之后,把消息給你扔回來, 這時候如果用的是同一個密鑰, 你可能就會以為這是服務器發回來的消息)
MAC secret 帶密碼的hash算法, 用來驗證身份, 而且它不能被公眾驗證身份。
5, 客戶端通知服務器, 自己將使用加密通信
6, finish (把1-5的信息加在一起發出去, ,不包含密鑰)
(4,5,6步在這里是一條請求)
7, 服務器端將使用加密通信
8, 服務器finish(1-7的信息加在一起發出去,不包含密鑰)