1. 數字簽名與證書
- 摘要算法用來實現完整性,能夠為數據生成獨一無二的“指紋”,常用的算法是 SHA-2;
- 數字簽名是私鑰對摘要的加密,可以由公鑰解密后驗證,實現身份認證和不可否認;
- 公鑰的分發需要使用數字證書,必須由 CA 的信任鏈來驗證,否則就是不可信的;
- 作為信任鏈的源頭 CA 有時也會不可信,解決辦法有 CRL(證書吊銷列表)、OCSP((在線證書狀態協議),還有終止信任。
在機密性的基礎上還必須加上完整性、身份認證等特性,才能實現真正的安全。
1.1. 摘要算法
實現完整性的手段主要是摘要算法(Digest Algorithm),也就是常說的散列函數、哈希函數(Hash Function)。
摘要算法近似地理解成一種特殊的壓縮算法,它能夠把任意長度的數據“壓縮”成固定長度、而且獨一無二的“摘要”字符串,就好像是給這段數據生成了一個數字“指紋”。
TLS推薦使用加密算法SHA-2。
SHA-2 實際上是一系列摘要算法的統稱,總共有 6 種,常用的有 SHA224、SHA256、SHA384,分別能夠生成 28 字節、32 字節、48 字節的摘要。
真正的完整性必須要建立在機密性之上,在混合加密系統里用會話密鑰加密消息和摘要,叫哈希消息認證碼(HMAC)。
1.2. 數字簽名
私鑰就是可以證明本人持有的東西,私鑰 + 摘要算法實現數字簽名, 同時實現,身份認證和不可否認。
數字簽名的原理其實很簡單,就是把公鑰私鑰的用法反過來,之前是公鑰加密、私鑰解密,現在是私鑰加密、公鑰解密。
數字簽名的過程:
- 創建消息摘要:發送者使用哈希函數(如SHA-256)生成消息的摘要,這是一個固定長度的字符串,代表了原始消息的內容。
- 使用私鑰進行加密:發送者使用自己的私鑰對消息摘要進行加密,生成數字簽名。
- 發送消息和簽名:發送者將原始消息和數字簽名一起發送給接收者。
- 驗證簽名:接收者使用發送者的公鑰對數字簽名進行解密,得到消息摘要。
- 驗證消息摘要:接收者生成接收到的消息的摘要。
- 比較摘要:接收者比較接收到的摘要和用發送者公鑰解密得到的摘要。如果兩者相同,說明消息未被篡改。
1.3. 數字證書和 CA
為了解決“公鑰的信任”問題。
誰都可以發布公鑰,我們還缺少防止黑客偽造公鑰的手段,也就是說,怎么來判斷這個公鑰就是你或者某寶的公鑰呢?
數字證書和CA的用途:
數字證書是由權威CA(證書頒發機構)簽發的電子憑證,用于驗證實體(如網站、個人)身份的真實性,并綁定其公鑰信息。它通過加密和簽名確保數據傳輸的機密性、完整性和不可抵賴性。
CA作為受信任的第三方,負責審核證書申請、簽發證書,并建立信任鏈,防止身份偽造,是互聯網信任體系的核心基礎。兩者共同保障通信安全與身份可信。
Question:那客戶端如何解密服務器發的加密消息呢?
簡要流程如下:
1. 客戶端發起請求(Client Hello)
- 瀏覽器發起 HTTPS 請求,告訴服務器自己支持哪些加密算法。
- 這個階段還沒有加密。
2. 服務器回應(Server Hello)
- 服務器選擇加密算法。
- 并把自己的 數字證書(包含公鑰) 發給客戶端。
3. 客戶端驗證證書是否合法
- 用操作系統或瀏覽器內置的可信 CA 證書庫驗證服務器證書是否合法(比如看證書是不是被偽造的)。
4. 生成對稱密鑰(關鍵步驟)
- 客戶端用服務器的“公鑰”加密一個隨機生成的“對稱密鑰”(也叫會話密鑰)。
- 然后把這個加密后的密鑰發送給服務器。
5. 服務器用私鑰解密
- 服務器用自己保管的“私鑰”解密這個密鑰,拿到會話密鑰。
6. 后續通信都用這個對稱密鑰加密
- 客戶端和服務器都有了相同的“會話密鑰”,后續通信(例如服務器返回的數據)就用這個密鑰加密。
- 客戶端收到加密數據后,用同一個密鑰解密即可。