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

AEAD (Authenticated Encryption with Associated Data) 基本體是最常見的資料加密基本體,適用於大多數需求。

AEAD 具有下列屬性:

  • Secrecy:除了長度之外,沒有人知道任何有關明文的資訊。
  • 真實性:如果未經偵測,就無法變更密文底層的加密純文字。
  • 對稱式:使用相同金鑰加密明文和解密密文。
  • 隨機化:加密方式為隨機。兩個具有相同明文的訊息會產生不同的密文。攻擊者無法得知哪個密文對應到特定明文。如要避免這種情況,請改用「Deterministic 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 較安全,但實際使用率較低。
    • 隨機隨機數的界限:
      • 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。

應用實例

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