流式 AEAD 基元可为流式数据提供认证加密。如果要加密的数据过大,无法在单个步骤中处理,此功能非常有用。典型用例包括加密大型文件或实时数据流。
加密是按分段进行的,这些分段绑定到其在密文中的位置,无法移除或重新排序。一个密文中的分段无法插入另一个密文中。如需修改现有密文,必须重新加密整个数据流。1
解密速度很快,因为一次只解密和身份验证密文的一部分。无需处理整个密文即可获取部分明文。
流式 AEAD 实现符合 AEAD 定义,并且具有 nOAE 安全性。它们具有以下属性:
- Secrecy:除了长度之外,关于明文的所有信息均不为人知。
- Authenticity:无法在不被检测的情况下更改密文底层的加密明文。
- Symmetric:使用相同的密钥加密明文和解密密文。
- 随机化:加密是随机的。具有相同明文的两条消息会产生不同的密文。攻击者无法知道哪个密文与给定明文相对应。
相关数据
流式 AEAD 基元可用于将密文与特定关联数据相关联。假设您有一个包含字段 user-id
和 encrypted-medical-history
的数据库:在这种情况下,在加密 encrypted-medical-history
时,user-id
可以用作关联数据。这样可以防止攻击者将一个用户的医疗记录从转移到另一个用户。
选择密钥类型
对于大多数用途,我们建议使用 AES128_GCM_HKDF_1MB。一般来说:
- AES-GCM-HKDF
- AES128_GCM_HKDF_1MB(或 AES256_GCM_HKDF_1MB)速度更快。它可以加密 264 个文件,每个文件最多包含 264 个字节。加密和解密过程中会消耗大约 1 MB 的内存。
- AES128_GCM_HKDF_4KB 会消耗大约 4 KB 的内存,如果系统内存不多,则是一个不错的选择。
- AES-CTR HMAC
- 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 个消息。 ↩