電腦網路與 Internet 通訊

單元 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 為每種代理寫金鑰及信任表。

  1. 為何普通 hash 不是 MAC?
  2. 有效 AEAD tag 為何不一定防重放?
  3. 固定 PSK 與臨時 DH 在長期祕密洩漏時可能有何差別?
  4. 加密到代理伺服器是否使代理無法知道最後目的地?

檢核:能說出「保護哪一段、對抗誰、信任誰」。來源: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。