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

附帶資料的已驗證加密 (AEAD) 原始碼是資料加密最常見的原始碼,可滿足大多數需求。

AEAD 具有下列屬性:

  • Secrecy:除了長度之外,沒有人知道明文的任何內容。
  • 真實性:系統會偵測出加密文字的基礎加密文字是否遭到變更。
  • 對稱:使用相同的金鑰加密明文和解密密文。
  • 隨機:加密方式為隨機。兩則含有相同明文的訊息會產生不同的密文。攻擊者無法得知哪個密文對應至特定明文。如要避免這種情況,請改用 Deterministic AEAD

相關資料

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

選擇金鑰類型

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

  • 使用 16 個位元組的初始化向量 (IV) 的 AES128_CTR_HMAC_SHA256 是具有良好邊界且最保守的模式。
  • AES128_EAX 的保守程度稍低,速度也比 AES128_CTR_HMAC_SHA256 快一點。
  • AES128_GCM 通常是最快速的模式,對訊息數量和訊息大小的限制也最嚴格。如果超出純文字和相關資料長度 (如下所述) 的限制,AES128_GCM 就會失敗並洩漏金鑰素材。
  • AES128_GCM_SIV 的速度幾乎與 AES128_GCM 相同。在郵件數量和郵件大小方面,它與 AES128_GCM 的限制相同,但如果超過這些限制,它會以較不嚴重的形式失敗:它可能只會洩漏兩個郵件相等的事實。因此,AES128_GCM 比 AES128_GCM 更安全,但在實際應用中較少使用。如要在 Java 中使用此功能,您必須安裝 Conscrypt
  • 相較於 AES128_GCM,XChaCha20Poly1305 對訊息數量和訊息大小的限制較為寬鬆,但在發生錯誤 (機率極低) 時,也會洩漏金鑰素材。這並未使用硬體加速,因此在可使用硬體加速的情況下,速度可能會比 AES 模式慢。

安全性保證

AEAD 實作項目提供以下功能:

  • CCA2 安全性。
  • 至少 80 位元驗證強度。
  • 能夠加密至少 232 封訊息,總共 250 個位元組。在最多 232 個選取的明文或密文中,沒有任何攻擊成功機率大於 2-32 的攻擊。

使用範例

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