單元 13 通訊安全的密碼學基礎
學習目標與問題
以單元 06 的訊息介面為基礎。你應能區分保密、完整性、身分驗證、前向保密與重放防護,畫出金鑰的來源與生命週期。本章理解服務與威脅,不自行發明或實作密碼協定。
13.1 先問威脅與信任
在路徑上的被動觀察者可看未加密內容;主動攻擊者可改、丟或注入訊息。伺服器本身可能看到解密後資料,端點遭控制時傳輸加密也無法保護應用明文。匿名性關注能否連結使用者、目的與行為,和保密不是同一保證。
13.2 原語與用途
| 原語 | 主要用途 | 不能獨自保證 |
|---|---|---|
| 雜湊 | 固定長度摘要 | 無金鑰雜湊不能證明傳送者 |
| 對稱加密 | 用共享祕密保護內容 | 單獨加密不一定防修改 |
| MAC/HMAC | 共享金鑰的訊息驗證 | 不是網路卡 MAC,也不提供公開驗證 |
| AEAD | 保密、完整性及關聯資料驗證 | 不自動記住以前收過的訊息 |
| 公開金鑰簽章 | 用私鑰簽、公開金鑰驗 | 仍需知道公開金鑰屬於誰 |
| DH 類金鑰協商 | 產生共享祕密 | 無驗證的協商可能被中間人取代 |
AEAD 接收 key、nonce、plaintext 和 associated data,輸出 ciphertext 與 tag。nonce 唯一性/使用限制依演算法及協定;重用 nonce 可能有嚴重後果,不可為教學方便固定到生產設定。associated data 被驗證但不由 AEAD 加密;需要保密的內容應放入 plaintext。
13.3 完整例題:安全的對話需要什麼
A 與 B 各產生臨時 DH 金鑰,交換公開值後推導共享祕密。若 A 沒有驗證 B 的公開值,攻擊者可分別與兩端協商。加入由可信身分金鑰簽署的握手 transcript,可把協商繫結到身分與參數;再用 key derivation 分離不同方向/用途金鑰。握手結束後採 AEAD 保護記錄。
這是概念堆疊,不是可直接部署的協定。真實協定還需版本降級防護、transcript 定義、錯誤處理、隨機來源及嚴格訊息格式。
13.4 前向保密與重放
前向保密 PFS 關注長期身分/認證金鑰日後洩漏時,已錄下的舊會話能否被解密。臨時 DH 祕密確實銷毀、協定使用正確時,可提供這種保護;僅依固定 PSK 加密的資料通常沒有同樣保證。PFS 不保證端點記憶體或會話祕密當下洩漏仍安全。
一份舊 AEAD 密文可能仍有有效 tag。防重放還需序號視窗、唯一 session 識別、時間或已見 nonce/salt 狀態,按協定組合。時間驗證也會受時鐘偏差及視窗設定影響。TLS 0-RTT 的重放風險需應用處理,不能只看「使用 AEAD」就宣稱安全。
13.5 密碼、憑證與實務邊界
人類密碼通常不是高熵 key,需要合適的密碼衍生;例如 Shadowsocks 2022 要求合適長度高熵 PSK,不接受舊式由人類密碼衍生的方式。憑證把公開金鑰與名稱/身分繫結,驗證時還需要信任來源、名稱、有效期及政策。不熟悉的自簽憑證不能僅以「有鎖頭」判斷可信。
實驗、習題與檢核
L13 使用現成 TLS 函式庫,比較信任正確、名稱錯誤與不信任三種情境;不自行實作 AEAD。L14 為每種代理寫金鑰及信任表。
- 為何普通 hash 不是 MAC?
- 有效 AEAD tag 為何不一定防重放?
- 固定 PSK 與臨時 DH 在長期祕密洩漏時可能有何差別?
- 加密到代理伺服器是否使代理無法知道最後目的地?
檢核:能說出「保護哪一段、對抗誰、信任誰」。來源:RFC 5116(AEAD)、RFC 2104(HMAC)、RFC 5869(HKDF)、RFC 9846(TLS 1.3)。
TLS 版本註記:2026 年修訂的 RFC 9846 取代 RFC 8446,協定版本仍為 TLS 1.3;ECH 參考 RFC 9849。