附帶資料的已驗證加密 (AEAD) 原始碼是資料加密最常見的原始碼,可滿足大多數需求。
AEAD 具有下列屬性:
- Secrecy:除了長度之外,沒有人知道明文的任何內容。
- 真實性:系統會偵測出加密文字的基礎加密文字是否遭到變更。
- 對稱:使用相同的金鑰加密明文和解密密文。
- 隨機:加密方式為隨機。兩則含有相同明文的訊息會產生不同的密文。攻擊者無法得知哪個密文對應至特定明文。如要避免這種情況,請改用 Deterministic AEAD。
相關資料
AEAD 可用於將密文繫結至特定相關資料。假設您有一個含有 user-id
和 encrypted-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 的攻擊。