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

「具有關聯資料的驗證加密」(AEAD) 基本體是最常見的資料加密基本體,適用於大多數需求。

AEAD 具有下列屬性:

  • Secrecy:除了長度之外,系統不會知道任何有關明文的資訊。
  • 真實性:在不被偵測到的情況下,無法變更密文底層的加密明文。
  • 對稱式:使用相同金鑰加密明文和解密密文。
  • 隨機化:加密作業會隨機進行。兩則明文相同的訊息會產生不同的密文。攻擊者無法得知特定明文對應的密文。如要避免這種情況,請改用「Deterministic AEAD」。

相關資料

AEAD 可用於將密文繫結至特定關聯資料。假設您有一個資料庫,其中包含 user-idencrypted-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) 的速度幾乎與 AES-GCM 相同。訊息數量和訊息大小的限制與 AES-GCM 相同,但超出這些限制時,失敗的嚴重程度較輕微:可能只會洩漏兩則訊息相等的事實。因此,使用 AES-GCM-SIV 比 AES-GCM 安全,但實務上較少使用。如要在 Java 中使用這項功能,您必須安裝 Conscrypt
    • 未提交金鑰的 ADGKLS
  • 與 AES-GCM 相比,XChaCha20-Poly1305 (XCHACHA20_POLY1305) 的郵件數量和郵件大小限制高出許多,但如果失敗 (機率極低),也會洩漏金鑰資料。由於未採用硬體加速,因此在可使用硬體加速的情況下,速度可能會比 AES 模式慢。
    • 未提交金鑰的 LGR

進一步瞭解 AEAD 密文的線路格式

安全保障

AEAD 實作方式的優點:

  • CCA2 安全性。
  • 驗證強度至少 80 位元。
  • 至少可加密 232 封郵件,總共 250 個位元組。如果選擇最多 232 個明文或密文,任何攻擊的成功機率都大於 2-32

應用實例

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