「具有關聯資料的驗證加密」(AEAD) 基本體是最常見的資料加密基本體,適用於大多數需求。
AEAD 具有下列屬性:
- Secrecy:除了長度之外,系統不會知道任何有關明文的資訊。
- 真實性:在不被偵測到的情況下,無法變更密文底層的加密明文。
- 對稱式:使用相同金鑰加密明文和解密密文。
- 隨機化:加密作業會隨機進行。兩則明文相同的訊息會產生不同的密文。攻擊者無法得知特定明文對應的密文。如要避免這種情況,請改用「Deterministic AEAD」。
相關資料
AEAD 可用於將密文繫結至特定關聯資料。假設您有一個資料庫,其中包含 user-id 和 encrypted-medical-history 欄位。在這種情況下,加密 encrypted-medical-history 時,user-id 可做為關聯資料。這可防止攻擊者將某位使用者的病史轉移給另一位使用者。
關聯資料為選用項目。如果指定關聯資料,則只有在加密和解密呼叫中傳遞相同的關聯資料時,解密才會成功。
選擇車鑰類型
雖然我們建議大多數使用者採用 AES128_GCM,但您可根據不同需求選擇各種金鑰類型。AES128 提供 128 位元安全性,AES256 則提供 256 位元安全性。
選擇模式時,有兩項重要的安全限制:
- QPS:使用相同金鑰加密的訊息數量。
- 郵件大小:郵件有多大?
支援的金鑰類型:
- 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-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。