流式 AEAD 基元为流式数据提供经过身份验证的加密。要加密的数据太大而无法通过一步处理,这种加密方式非常有用。典型用例包括对大型文件或实时数据流进行加密。
加密是按分段进行的,这些分段绑定到密文中的位置,无法移除或重新排序。一个密文中的段不能插入另一个密文中。如需修改现有密文,必须重新加密整个数据流。1
解密速度很快,因为一次只解密和身份验证密文的一部分。部分明文无需处理整个密文即可获得。
流式 AEAD 实现符合 AEAD 定义,并且具有 nOAE 安全性。它们具有以下属性:
- 机密性:除了长度之外,关于明文的所有信息均不为人知。
- 真实性:无法在不被检测的情况下更改密文底层的加密明文。
- 对称:使用相同的密钥加密明文和解密密文。
- 随机化:加密是随机的。具有相同明文的两条消息会产生不同的密文。攻击者无法知道哪个密文与给定明文相对应。
相关数据
流式 AEAD 可用于将密文与特定关联数据相关联。假设您有一个包含字段 user-id
和 encrypted-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 实现具有以下优势:
用例示例
请参阅我想加密大文件或数据流。
-
存在此限制的原因是使用了 AES-GCM 加密算法。在同一位置加密不同的明文段相当于重复使用 IV,这违反了 AES-GCM 的安全保证。另一个原因是,这样可以防止回滚攻击,攻击者可能会尝试在不被检测的情况下恢复文件的旧版本。 ↩
-
支持 232 个区段,每个区段包含
segment_size - tag_size
个字节的明文。对于 1 MB 段,明文总大小为 232 * (220-16) ~= 251 个字节。 ↩ -
当派生密钥(128 位)和 Nonce 前缀(独立的随机 7 字节值)组合重复时,流式 AEAD 会变得不安全。我们采用了 184 位碰撞抵抗性,如果我们希望成功概率小于 2-32,则大致相当于 264 个消息。 ↩