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

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

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

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

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

  • 保密:除了明文长度之外,对明文没有任何已知。
  • 真实性:在不被检测到的情况下,无法更改密文底层的加密明文。
  • 对称:使用同一密钥加密明文和解密密文。
  • 随机:加密是随机进行的。明文相同的两条消息会产生不同的密文。攻击者不知道哪个密文与给定的明文相对应。

相关数据

流式 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 条消息。