使用关联数据的身份验证加密 (AEAD)

带有关联数据的身份验证加密 (AEAD) 原语是最常见的数据加密原语,适合大多数需求。

AEAD 具有以下属性:

  • Secrecy:除了明文的长度之外,对明文一无所知。
  • 真实性:在不被检测到的情况下,无法更改密文所对应的加密明文。
  • 对称:使用同一密钥加密明文和解密密文。
  • 随机化:加密是随机的。两条具有相同明文的消息会产生不同的密文。攻击者无法知道哪个密文对应于给定的明文。如果您想避免这种情况,请改用确定性 AEAD

相关数据

AEAD 可用于将密文与特定的关联数据相关联。假设您有一个包含字段 user-idencrypted-medical-history 的数据库。在这种情况下,user-id 可在加密 encrypted-medical-history 时用作关联数据。这样可防止攻击者将一个用户的医疗记录转移到另一个用户。

关联数据是可选的。如果指定了关联数据,则只有在加密和解密调用中传递了相同的关联数据时,解密才会成功。

选择密钥类型

虽然我们建议在大多数情况下使用 AES128_GCM,但也有各种密钥类型可满足不同需求。AES128 提供 128 位安全性,而 AES256 提供 256 位安全性。

选择模式时,需要注意以下两个重要的安全限制:

  1. QPS:使用同一密钥加密的消息数量是多少?
  2. 消息大小:消息有多大?

一般来说:

  • 采用 16 字节初始化向量 (IV) 的 AES-CTR-HMAC(AES128_CTR_HMAC_SHA256、AES256_CTR_HMAC_SHA256)是一种界限良好的最保守模式。
  • AES-EAX(AES128_EAX、AES256_EAX)比 AES128_CTR_HMAC_SHA256 的保守程度略低,速度略快。
  • AES-GCM(AES128_GCM、AES256_GCM)通常是最快的模式,但对消息数量和消息大小的限制最为严格。如果明文和关联数据的长度(如下)超出这些限制,AES-GCM 会发生灾难性故障并泄露密钥材料。
  • AES-GCM-SIV(AES128_GCM_SIV、AES256_GCM_SIV)的速度几乎与 AES-GCM 相当。它在消息数量和消息大小方面与 AES-GCM 具有相同的限制,但当超出这些限制时,它不会以灾难性的方式失败:它可能只会泄露两条消息相等这一事实。这使得它比 AES-GCM 更安全,但在实践中不太常用。如需在 Java 中使用此功能,您必须安装 Conscrypt
  • 与 AES-GCM 相比,XChaCha20-Poly1305 (XCHACHA20_POLY1305) 在消息数量和消息大小方面有更大的限制,但一旦失败(非常罕见),也会泄露密钥材料。它不使用硬件加速,因此在可以使用硬件加速的情况下,它可能比 AES 模式慢。

安全保证

AEAD 实现提供:

  • CCA2 安全性。
  • 至少 80 位的身份验证强度。
  • 能够加密至少 232 条总共 250 字节的消息。任何攻击(最多使用 232 个所选明文或所选密文)的成功概率均不超过 2-32

应用场景示例

请参阅“我想加密数据”和“我想将密文绑定到其上下文”。