带有关联数据的流式传输身份验证加密 (Streaming AEAD)

流式 AEAD 基元为流式数据提供经过身份验证的加密。要加密的数据太大而无法通过一步处理,这种加密方式非常有用。典型用例包括对大型文件或实时数据流进行加密。

加密是按分段进行的,这些分段绑定到密文中的位置,无法移除或重新排序。一个密文中的段不能插入另一个密文中。如需修改现有密文,必须重新加密整个数据流。1

解密速度很快,因为一次只解密和身份验证密文的一部分。部分明文无需处理整个密文即可获得。

流式 AEAD 实现符合 AEAD 定义,并且具有 nOAE 安全性。它们具有以下属性:

  • 机密性:除了长度之外,关于明文的所有信息均不为人知。
  • 真实性:无法在不被检测的情况下更改密文底层的加密明文。
  • 对称:使用相同的密钥加密明文和解密密文。
  • 随机化:加密是随机的。具有相同明文的两条消息会产生不同的密文。攻击者无法知道哪个密文与给定明文相对应。

相关数据

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

选择密钥类型

对于大多数用途,我们建议使用 AES128_GCM_HKDF_1MB。一般来说:

  • AES128_GCM_HKDF_1MB(或 AES256_GCM_HKDF_1MB)速度更快。它可以加密 264 个文件,每个文件最多包含 264 个字节。加密和解密过程中会消耗大约 1 MB 的内存。
  • AES128_GCM_HKDF_4KB 会占用约 4 KB 的内存,如果您的系统没有大量内存,则 AES128_GCM_HKDF_4KB 是不错的选择。
  • AES128_CTR_HMAC_SHA256_1MB(或 AES256_CTR_HMAC_SHA256_1MB)是一种更为保守的选项。

安全保证

流式 AEAD 实现具有以下优势:

  • CCA2 安全性。
  • 身份验证强度至少为 80 位。
  • 能够加密至少 264 条消息3,总计 251 字节2。任何使用最多 232 个已选明文或已选密文的攻击,其成功概率都不会大于 2-32

用例示例

请参阅我想加密大文件或数据流


  1. 存在此限制的原因是使用了 AES-GCM 加密算法。在同一位置加密不同的明文段相当于重复使用 IV,这违反了 AES-GCM 的安全保证。另一个原因是,这样可以防止回滚攻击,攻击者可能会尝试在不被检测的情况下恢复文件的旧版本。 

  2. 支持 232 个区段,每个区段包含 segment_size - tag_size 个字节的明文。对于 1 MB 段,明文总大小为 232 * (220-16) ~= 251 个字节。 

  3. 当派生密钥(128 位)和 Nonce 前缀(独立的随机 7 字节值)组合重复时,流式 AEAD 会变得不安全。我们采用了 184 位碰撞抵抗性,如果我们希望成功概率小于 2-32,则大致相当于 264 个消息。