流式 AEAD 基元为流式数据提供经过身份验证的加密。当要加密的数据过大而无法一步处理时,此方法非常有用。典型用例包括加密大型文件或实时数据流。
加密是按片段完成的,这些片段在密文中绑定到相应位置,无法移除或重新排序。一个密文中的片段不能插入到另一个密文中。如需修改现有密文,必须重新加密整个数据流。1
解密速度很快,因为一次只能对密文的一部分进行解密和身份验证。无需处理整个密文即可获得部分明文。
流式 AEAD 实现符合 AEAD 定义,且为 OAE2 安全。它们具有以下属性:
- 保密:除了明文长度之外,对明文没有任何已知。
- 真实性:在不被检测到的情况下,无法更改密文底层的加密明文。
- 对称:使用同一密钥加密明文和解密密文。
- 随机:加密是随机进行的。明文相同的两条消息会产生不同的密文。攻击者不知道哪个密文与给定的明文相对应。
相关数据
流式 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 条消息。 ↩