使用關聯資料進行驗證 (AEAD)

支援關聯資料的驗證式加密 (AEAD) 是最常見的資料加密原語,適用於大多數需求。

AEAD 具有下列屬性:

  • Secrecy:除了長度之外,明文的任何資訊都不會外洩。
  • 真實性:無法在不被偵測到的情況下,變更密文底層的加密明文。
  • 對稱:使用相同金鑰加密明文及解密密文。
  • 隨機化:加密方式為隨機。兩個具有相同明文的訊息會產生不同的密文。攻擊者無法得知哪個密文對應到特定明文。如要避免這種情況,請改用確定性 AEAD。

相關資料

AEAD 可用於將密文繫結至特定相關聯資料。假設資料庫包含 user-id 和 encrypted-medical-history 欄位。在這種情況下,加密 encrypted-medical-history 時,可以使用 user-id 做為關聯資料。這可防止攻擊者將病歷從一位使用者轉移到另一位使用者。

不一定要提供相關聯的資料。如果指定,只有在將相同的關聯資料傳遞至加密和解密呼叫時,解密才會成功。

選擇金鑰類型

雖然我們建議在大多數情況下使用 AES128_GCM,但您也可以根據不同需求選擇各種金鑰類型。AES128 提供 128 位元安全性,AES256 則提供 256 位元安全性。

選擇模式時,有兩項重要的安全性限制:

  1. QPS:有多少郵件使用相同金鑰加密?
  2. 郵件大小:郵件有多大?

支援的金鑰類型:

  • AES-CTR-HMAC (AES128_CTR_HMAC_SHA256、AES256_CTR_HMAC_SHA256) 搭配 16 位元組初始化向量 (IV) 是最保守的模式,具有良好的界限。
    • 金鑰承諾。
  • AES-EAX (AES128_EAX、AES256_EAX) 稍微不保守,速度也比 AES128_CTR_HMAC_SHA256 稍快。
    • 非金鑰承諾 MLGR。
  • AES-GCM (AES128_GCM、AES256_GCM) 通常是最快的模式,對訊息數量 (232) 和訊息大小 (每則訊息約 64 GB) 有最嚴格的限制。超過這些限制時,AES-GCM 會發生嚴重錯誤,洩漏明文和 AES-GCM 內部金鑰的驗證部分。
    • AES-GCM 不是穩固的 [ABN],也不是金鑰承諾 [GLR]。您可以產生能以兩種不同金鑰解密的密文。這可能導致實際攻擊 [DGRW]。如果金鑰是由攻擊者選擇,請仔細檢查威脅模型。
  • AES-GCM-SIV (AES128_GCM_SIV、AES256_GCM_SIV) [RFC8452] 可防止意外誤用 Nonce,效能幾乎與 AES-GCM 相同。對於採用隨機 IV 的 AES-GCM-SIV,訊息數量和大小的限制遠高於 AES-GCM。如果超過這些限制,AES-GCM-SIV 的失敗情況較不嚴重:只會洩漏兩則訊息相同。AES-GCM-SIV 較安全,但實際使用率較低。
    • 隨機 Nonce 的界限:
      • 232 則訊息,每則明文最多 8 GiB
      • 248 則訊息,每則明文最多 32 MiB
      • 264 則訊息,每則明文最多 128 KiB
    • 如要在 Java 中使用,請安裝 Conscrypt。
    • 非金鑰承諾 ADGKLS。
  • XChaCha20-Poly1305 (XCHACHA20_POLY1305) 的訊息數量和訊息大小限制遠高於 AES-GCM,但如果失敗 (極不可能發生),也會洩漏金鑰內容。這項演算法不支援硬體加速,因此在可使用硬體加速的情況下,速度可能比 AES 模式慢。
    • 非金鑰繫結 LGR。

進一步瞭解 AEAD 密文的傳輸格式。

安全性保證

AEAD 實作提供:

  • CCA2 安全性。
  • 驗證強度至少 80 位元。
  • 能夠加密至少 232 則訊息,總計 250 個位元組。如果攻擊者選擇最多 232 個明文或密文,攻擊成功的機率不會超過 2-32。

應用實例

請參閱「我想加密資料」和「我想將密文繫結至其內容」。