带有关联数据的身份验证加密 (AEAD) 原语是数据加密最常见的原语,适用于大多数需求。
AEAD 具有以下属性:
- Secrecy:除了长度之外,关于明文的所有信息均不为人知。
- 真实性:无法在不被检测的情况下更改密文底层的加密明文。
- 对称:使用相同的密钥加密明文和解密密文。
- 随机化:加密是随机的。具有相同明文的两条消息会产生不同的密文。攻击者无法知道哪个密文与给定明文相对应。如果您想避免这种情况,请改用确定性 AEAD。
相关数据
AEAD 可用于将密文与特定关联数据相关联。假设您有一个包含字段 user-id
和 encrypted-medical-history
的数据库。在此场景中,在加密 encrypted-medical-history
时,user-id
可用作关联数据。这样可以防止攻击者将一个用户的医疗记录从转移到另一个用户。
选择密钥类型
虽然我们建议在大多数用例中使用 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 相比,它更安全,但在实践中使用得较少。如需在 Java 中使用此功能,您必须安装 Conscrypt。
- 与 AES128_GCM 相比,XChaCha20Poly1305 对消息数量和消息大小的限制要大得多,但如果它确实失败(可能性很小),也会泄露密钥材料。它不支持硬件加速,因此在可使用硬件加速的情况下,其速度可能会比 AES 模式慢。
安全保证
AEAD 实现提供:
- CCA2 安全性。
- 身份验证强度至少为 80 位。
- 能够加密至少 232 条消息,总计 250 字节。任何攻击都无法使用最多 232 个已选明文或已选密文,其成功概率大于 2-32。
用例示例
请参阅我想加密数据,并且我想将密文绑定到其上下文。