带关联数据的经过身份验证的加密 (AEAD) 原语是数据加密最常用的原语,适用于大多数需求。
AEAD 具有以下属性:
- Secrecy:除了明文的长度之外,明文的任何信息都不得泄露。
- 真实性:无法在不被检测到的情况下更改密文下的加密明文 。
- 对称性:加密明文和解密密文使用 相同的密钥。
- 随机化:加密是随机的。两条具有相同明文的消息会生成不同的密文。攻击者无法知道哪个密文对应于给定的明文。如果您想避免这种情况,请改用 确定性 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) 和消息大小 (每条消息约 64GB)的限制最为严格。如果超出这些限制,AES-GCM 会因泄露明文和 AES-GCM 内部密钥的身份验证部分而发生灾难性故障。
- AES-GCM-SIV(AES128_GCM_SIV、AES256_GCM_SIV)
[RFC8452] 可防止意外的
nonce 误用,并且性能几乎与 AES-GCM 相当。对于采用随机 IV 的 AES-GCM-SIV,消息数量和消息大小的限制远高于 AES-GCM 的限制。如果超出这些限制,AES-GCM-SIV
的故障灾难性较小:它只会泄露
两条消息相等。
AES-GCM-SIV 使用起来更安全,但在实践中不太常用。
- 随机 nonce 的边界:
- 232 条消息,其中每条明文最多为 8 GiB
- 248 条消息,其中每条明文最多为 32 MiB
- 264 条消息,其中每条明文最多为 128 KiB
- 如需在 Java 中使用,请安装 Conscrypt。
- 不提交密钥 ADGKLS。
- 随机 nonce 的边界:
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) 对消息数量和消息大小的限制远高于 AES-GCM,但如果发生故障(非常不可能),它也会泄露密钥材料。它没有硬件加速,因此在可以使用硬件加速的情况下,它可能比 AES 模式慢。
- 不提交密钥 LGR。
详细了解 AEAD 密文的网络格式。
安全保证
AEAD 实现提供:
- CCA2 安全性。
- 至少 80 位的身份验证强度。
- 能够加密至少 232 条消息,总共 250 字节。在最多 232 个选定明文 或选定密文的情况下,没有攻击的成功概率大于 2-32。