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

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

AEAD 具有下列屬性:

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

相關資料

AEAD 可用來將密文繫結至特定相關聯資料。假設您有一個資料庫,其中包含 user-idencrypted-medical-history 欄位。在這種情況下,加密 encrypted-medical-history 時,user-id 可做為相關聯的資料。這可防止攻擊者將醫療記錄從一位使用者轉移給另一位使用者。

關聯資料為選用項目。如果指定,只有在傳遞至加密和解密呼叫的相關聯資料相同時,解密才會成功。

選擇車鑰類型

雖然我們建議在大多數情況下使用 AES128_GCM,但不同需求有不同的金鑰類型 (如要使用 256 位元安全機制,請將下方的 AES128 替換為 AES256)。一般而言:

  • AES128_CTR_HMAC_SHA256 (含 16 位元組的初始化向量 (IV)) 是最保守的模式,且具有良好的界限。
  • AES128_EAX 比 AES128_CTR_HMAC_SHA256 稍微不保守,速度也稍微快一點。
  • AES128_GCM 通常是最快的模式,但對訊息數量和訊息大小的限制最嚴格。如果超過這些明文和相關資料長度限制 (如下),AES128_GCM 就會失敗並洩漏金鑰資料。
  • AES128_GCM_SIV 的速度幾乎與 AES128_GCM 相同。訊息數量和訊息大小的限制與 AES128_GCM 相同,但如果超出這些限制,失敗的嚴重程度較輕微,可能只會洩漏兩則訊息相等的事實。因此比 AES128_GCM 更安全,但實務上較少使用。如要在 Java 中使用這項功能,您必須安裝 Conscrypt
  • XChaCha20Poly1305 的訊息數量和訊息大小上限遠高於 AES128_GCM,但一旦失敗 (機率極低),也會洩漏金鑰資料。由於未採用硬體加速,因此在可使用硬體加速的情況下,速度可能會比 AES 模式慢。

安全保障

AEAD 實作方式的優點:

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

應用實例

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