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

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

AEAD 具有下列屬性:

  • Secrecy:除了長度之外,系統不會知道任何有關明文的資訊。
  • 真實性:如果想變更密文底層的加密純文字,一定會遭到偵測。
  • 對稱式:使用相同金鑰加密明文和解密密文。
  • 隨機化:加密作業會隨機進行。兩則明文相同的訊息會產生不同的密文。攻擊者無法得知哪個密文對應到特定明文。如要避免這種情況,請改用確定性 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 快一點。
  • AES-GCM (AES128_GCM、AES256_GCM) 通常是最快的模式,但對訊息數量和訊息大小的限制最嚴格。如果超過這些明文和相關資料長度的限制 (如下),AES-GCM 就會發生災難性錯誤,並洩漏金鑰材料。
  • AES-GCM-SIV (AES128_GCM_SIV、AES256_GCM_SIV) 的速度幾乎與 AES-GCM 相同。 訊息數量和訊息大小的限制與 AES-GCM 相同,但超出這些限制時,失敗的影響較小:可能只會洩漏兩則訊息相等的事實。因此比 AES-GCM 更安全,但實際使用時較不常見。如要在 Java 中使用這項功能,請安裝 Conscrypt
  • 與 AES-GCM 相比,XChaCha20-Poly1305 (XCHACHA20_POLY1305) 的郵件數量和郵件大小限制高出許多,但如果失敗 (機率極低),也會洩漏金鑰資料。由於未採用硬體加速,因此在可使用硬體加速的情況下,這項模式可能會比 AES 模式慢。

安全保障

AEAD 實作方式的優點:

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

應用實例

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