HTTP 協議內容都是按照文本的方式明文傳輸的,這就導致在傳輸過程中出現一些被篡改的情況。HTTPS 就是在 HTTP 協議的基礎上引入了一個加密層的應用層協議。
1. 基礎概念
1.1 加密與解密
加密就是把明文(要傳輸的信息)進行一系列變換,生成密文。解密就是把密文再進行一系列變換,還原成明文。在這個加密和解密的過程中,往往需要一個或者多個中間的數據輔助進行這個過程,這樣的數據稱為密鑰。
為什么要加密?
因為 http 的內容是明文傳輸的,明文數據會經過路由器、wifi 熱點、通信服務運營商、代理服務器等多個物理節點。如果信息在傳輸過程中被劫持,傳輸的內容就完全暴露了。劫持者還可以篡改傳輸的信息且不被雙方察覺,這就是中間人攻擊 ,所以我們才需要對信息進行加密。
所以加密就是為了避免中間人攻擊。
1.2 常見的加密方式
1.2.1 對稱加密
采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密。
??特征:
加密和解密所用的密鑰是相同的。通過同一個 "密鑰" 把明文加密成密文,并且也能把密文解密成明文
??常見對稱加密算法:
DES、3DES、AES、TDEA、Blowfish、RC2 ……
??特點:
算法公開、計算量小、加密速度快、加密效率高
1.2.2 非對稱加密
需要兩個密鑰來進行加密和解密,這兩個密鑰是公鑰私鑰。
? 特征:
通過公鑰對明文加密,變成密文;通過私鑰對密文解密,變成明文。也可以反著用,通過私鑰對明文加密,變成密文;通過公鑰對密文解密,變成明文
? 常見非對稱加密算法:
RSA,DSA,ECDSA ……
? 特點:
算法強度復雜、安全性依賴于算法與密鑰,但是由于其算法復雜,而使得加密解密速度沒有對稱加密解密的速度快。 最大的缺點就是運算速度非常慢,比對稱加密要慢很多。
1.2.3 數據摘要(數字指紋)
數字指紋(數據摘要),其基本原理是利用單向散列函數(Hash 函數)對信息進行運算,生成一串固定長度的數字摘要。數字指紋并不是一種加密機制,但可以用來判斷數據有沒有被篡改。
? 常見摘要算法:
MD5、SHA1、SHA256、SHA512 …… 算法把無限的映射成有限,因此可能會有碰撞(兩個不同的信息,算出的摘要相同,但是概率非常低)
? 特征:
摘要嚴格意義不是加密,通常用來進行數據對比
2. HTTPS的工作過程探索
2.1 方案一:只使用對稱加密
若只使用對稱加密的話,服務端如何得知客戶端的密鑰呢?往往是在建立連接時將密鑰傳過去,那么如何保證密鑰的安全性呢?在給密鑰加密嗎?這不就變成了雞生蛋,蛋生雞的問題了嗎?因此該方案不具備可行性!
2.2 方案二:只使用非對稱加密
只使用非對稱加密我們可以看到貌似是要比對稱加密要好的,不過在初始建立聯系時,公鑰還是面臨著被中間人獲取的安全問題。當客戶端向服務端發消息時,需要服務端使用私鑰進行解密的,而私鑰是沒法被獲取的,所以可以認為是安全的。但是服務端向客戶端發送消息時,需要客戶端通過公鑰進行解密,而公鑰是可以被獲取的,所以這一部分是不安全的。可以認為是單向安全的。
2.3 方案三:雙方都使用非對稱加密
這次總可以了吧,但是效率太慢了(非對稱加密的速度很慢,開始時提到過)。而且這種方案也存在著安全問題(講完方案四具體來說)。
2.4 方案四:非對稱加密 + 對稱加密
這一部分我們只使用非對稱密鑰用于初始時交換公鑰,所以效率是提高了的,但是這一部分就沒有問題了嗎?
中間人攻擊:
上面這種情況就是中間人就可以拿到對稱密鑰X了,中間人就可以自由的解密監聽信息,并篡改相應信息了。
此時面對中間人攻擊的核心問題就是:客戶端無法甄別自己收到的公鑰是一個由客戶端發出的合法的公鑰,所以接下來我們看看這個問題是如何解決的。
數據簽名
簽名的形成是基于非對稱加密算法的。它的作用就是對數據摘要(數字指紋)進行加密。
可以看出只有持有私鑰的簽名者菜呢個對數據進行簽名,那么誰是簽名者呢?
CA機構與證書
服務端在使用 HTTPS 前,需要向 CA 機構申領一份數字證書,數字證書里含有證書申請者信息、公鑰信息等。服務器把證書傳輸給瀏覽器,瀏覽器從證書里獲取公鑰就行了,證書就如身份證,證明服務端公鑰的權威性。
接下來看一下證書的格式:
我們可以看出,證書實質上就是攜帶簽名的明文數據。
CA機構簽發證書的流程:
可以知道,當客戶端收到證書之后需要對證書中的公鑰提取,即解密證書。故而所有的瀏覽器都要內置一些可行的CA機構或者它授權的子機構的公鑰!
2.5 方案五:非對稱加密 + 對稱加密 + 證書認證
使用這種方案就可以避免中間人的攻擊了,因為中間人哪怕拿到了證書也無法對證書進行篡改。而這種方案也就是當前的HTTPS使用的工作方案。
總結:
HTTPS 工作過程中涉及到的密鑰有三組。
第一組(非對稱加密):用于校驗證書是否被篡改。服務器持有私鑰(私鑰在形成 CSR 文件與申請證書時獲得),客戶端持有公鑰(操作系統包含了可信任的 CA 認證機構有哪些, 同時持有對應的公鑰),服務器在客戶端請求時,返回攜帶簽名的證書,客戶端通過這個公鑰進行證書驗證,保證證書的合法性,進一步保證證書中攜帶的服務端公鑰權威性。
第二組(非對稱加密):用于協商生成對稱加密的密鑰。客戶端用收到的 CA 證書中的公鑰(是可被信任的)給隨機生成的對稱加密的密鑰加密傳輸給服務器,服務器通過私鑰解密獲取到對稱加密密鑰。
第三組(對稱加密):客戶端和服務器后續傳輸的數據都通過這個對稱密鑰加密解密。
其實一切的關鍵都是圍繞這個對稱加密的密鑰,其他的機制都是輔助這個密鑰工作的。第二組非對稱加密的密鑰是為了讓客戶端把這個對稱密鑰傳給服務器,第一組非對稱加密的密鑰是為了讓客戶端拿到第二組非對稱加密的公鑰。