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