Learning Objectives
- 說明對稱加密的用途,以及金鑰分發的困難
- 由程式實際計算的結果,說明 ECB 模式會洩漏明文的結構
- 說明公鑰加密與數位簽章的差別
- 以小數字完成 Diffie-Hellman 金鑰交換,並說明中間人攻擊為什麼需要憑證才能防範
對稱加密與金鑰分發
學校要把成績檔傳給各系辦公室,路途中經過的網路設備都可能看到內容。第 2 課的雜湊無法解決這個問題,因為收件人需要還原原文,這時需要加密。
對稱加密以同一把金鑰加密與解密,速度快,適合大量資料。目前的主流標準是 AES(FIPS 197),區塊長度 128 位元,金鑰長度 128、192 或 256 位元。本課不討論 AES 的內部運算,實務上使用經過驗證的函式庫即可。
對稱加密的難題在於金鑰分發:雙方必須先共有同一把金鑰,而傳送金鑰本身就需要安全的通道。規模也是問題:若 100 個人兩兩都要有獨立的金鑰,共需要 100 × 99 ÷ 2 = 4,950 把。
AES 一次只處理一個區塊,處理長資料的方式稱為工作模式。最直接的作法是把資料切塊後各自加密,稱為 ECB。下方的練習以瀏覽器提供的 AES 真正加密一張圖,比較 ECB 與 CBC。
公鑰加密與數位簽章
OWASP 不建議使用 ECB,並建議優先採用同時提供完整性保護的已驗證模式,例如 GCM 與 CCM。CBC 能隱藏重複結構,但本身不能偵測竄改。
非對稱加密使用一對金鑰:公鑰可以公開,私鑰由持有者保管。兩把金鑰的用途依方向而不同:
| 用途 | 使用的金鑰 | 達成的效果 |
|---|---|---|
| 公鑰加密 | 以收件人的公鑰加密,收件人以私鑰解密 | 只有收件人能讀取 |
| 數位簽章 | 以寄件人的私鑰簽章,任何人以公鑰驗證 | 確認訊息來自私鑰持有者,且未被更動 |
數位簽章不提供機密性:訊息本身仍然可以被任何人讀取。實務上會先對訊息計算雜湊值,再對雜湊值簽章。
非對稱運算遠比對稱運算慢,所以常見的作法是混合式:以非對稱技術建立對稱金鑰,再以對稱加密傳輸資料。RSA 金鑰的長度至少應有 2048 位元;下方練習的小數字只用於說明流程。
Diffie-Hellman 金鑰交換
Diffie-Hellman 金鑰交換讓雙方在公開的通道上算出一把共同的金鑰,而金鑰本身從未經過通道傳送:
- 雙方公開約定大質數 p 與底數 g
- Alice 選祕密值 a,送出 A = g^a mod p;Bob 選祕密值 b,送出 B = g^b mod p
- Alice 計算 B^a mod p,Bob 計算 A^b mod p;兩者都等於 g^(ab) mod p
p, g = 23, 5
a, b = 4, 3 # 雙方各自的祕密值,不傳送
A = pow(g, a, p) # 4
B = pow(g, b, p) # 10
print(pow(B, a, p), pow(A, b, p)) # 雙方算出相同的金鑰(18 18)
觀察者看得到 p、g、A、B。要算出金鑰,目前已知最有效的途徑是由 A 反推 a(或由 B 反推 b),這稱為離散對數問題。當 p 夠大時,以現有的電腦沒有有效率的解法。下方練習先以小數字親手計算,再比較不同大小的 p。實際系統使用的有限體群組至少 2048 位元(RFC 7919),或是橢圓曲線群組(如 X25519)。
中間人攻擊與憑證的作用
Diffie-Hellman 能抵抗只會監聽的觀察者,但它沒有驗證對方的身分。能夠修改通訊內容的攻擊者 Mallory,可以分別與兩端進行金鑰交換:她對 Alice 假裝成 Bob,對 Bob 假裝成 Alice,雙方都以為金鑰交換已經成功。這稱為中間人攻擊(man-in-the-middle)。
防範方式是讓公開值帶有可驗證的簽章。Bob 以私鑰對公開值簽章,Alice 以 Bob 的公鑰驗證。問題接著變成:Alice 如何確認手上的公鑰確實屬於 Bob。憑證由受信任的機構簽署,把名稱與公鑰綁在一起,下一課討論這條信任鏈。TLS 1.3 的 CertificateVerify 訊息以私鑰對交握內容簽章,證明伺服器擁有憑證對應的私鑰。
本課的模擬環境。 下方的中間人情境完全在瀏覽器內計算,人物與資料都是虛構的,不會攔截任何真實的通訊。對未獲授權的網路進行攔截可能觸犯法律(第 1 課)。
重點整理
- 對稱加密(AES)快速,但雙方要先有相同的金鑰
- 工作模式影響安全性:ECB 會洩漏重複結構;優先使用同時保護完整性的已驗證模式(GCM、CCM)
- 公鑰加密由公鑰加密、私鑰解密;數位簽章由私鑰簽章、公鑰驗證,提供來源與完整性,不提供機密性
- Diffie-Hellman 讓雙方在公開通道上算出共同金鑰,能抵抗監聽,但本身不驗證身分
- 中間人攻擊要靠簽章與憑證防範:驗證公鑰確實屬於對方
- 不要自製加密演算法或組合方式。 OWASP 對自製演算法的建議只有一句:不要這樣做。應使用維護中的函式庫與標準參數
下一課將這些元件組合起來,說明 TLS 與憑證。
小測驗
同時有對稱與非對稱技術可用時,常見的作法是什麼?
資料庫以 AES-ECB 加密一個只有「已繳費」「未繳費」兩種值的欄位。外洩後,取得資料的人能得知什麼?
數位簽章能提供下列哪一項?
Diffie-Hellman 金鑰交換中,下列何者需要保密?
只使用未經驗證的 Diffie-Hellman,能防範下列何者?