带关联数据的身份验证加密 (AEAD) 基元是最常见的数据加密基元,可满足大多数需求。
AEAD 具有以下属性:
- 保密:除了明文长度之外,对明文没有任何已知。
- 真实性:在不被检测到的情况下,无法更改密文底层的加密明文。
- 对称:使用同一密钥加密明文和解密密文。
- 随机:加密是随机进行的。明文相同的两条消息会产生不同的密文。攻击者不知道哪个密文与给定的明文相对应。如果您想避免这种情况,请改用确定性 AEAD。
相关数据
AEAD 可用于将密文与特定关联数据联系。假设您有一个数据库,其中包含 user-id
和 encrypted-medical-history
字段。在这种情况下,可以在加密 encrypted-medical-history
时将 user-id
用作关联数据。这可以防止攻击者将医疗记录从一个用户转移到另一个用户。
选择密钥类型
虽然我们建议将 AES128_GCM 用于大多数用途,但有多种密钥类型可满足不同的需求(为实现 256 位安全性,请将下面的 AES128 替换为 AES256)。一般情况:
- 采用 16 字节初始化矢量 (IV) 的 AES128_CTR_HMAC_SHA256 是具有良好边界的最保守模式。
- 与 AES128_CTR_HMAC_SHA256 相比,AES128_EAX 稍微保守一些,稍微快一些。
- AES128_GCM 通常是最快的模式,对消息数量和消息大小限制最严格。当超出明文和相关数据长度的限制(见下文)时,AES128_GCM 会失败并泄露密钥材料。
- AES128_GCM_SIV 的速度几乎与 AES128_GCM 一样快,可以很好地限定大量消息的边界,但存在一定程度上稍低一些。如需在 Java 中使用此方法,您必须安装 Conscrypt。
- 与 AES128_GCM 相比,XChaCha20Poly1305 在消息数量和消息大小限制上具有更高的限制,但在失败(可能性极小)时,它也会泄露密钥材料。它不是硬件加速,因此在支持硬件加速的情况下,它的速度可能比 AES 模式慢。
安全保证
AEAD 实现具有以下优势:
- CCA2 安全性。
- 至少 80 位身份验证强度。
- 能够加密至少 232 条消息(总共 250 个字节)。使用最多 232 个选定的明文或所选密文的成功概率大于 2-32 的攻击。
用例示例
请参阅“我要加密数据”,并将密文绑定到其上下文。