使用秘密作为 IV

Using secret as IV

我有一个应用程序,其中敏感数据需要以每个 运行 从相同输入生成相同加密值的方式进行加密。主要数据类型是电子邮件地址。加密值需要始终相同,因为它们是匹配的以进行统计分析。产生数据的运行将在很长一段时间内定期发生。这使得为​​ AES 加密选择 IV 有点棘手。问题是:将秘密(给​​定密码的哈希值)也用作 IV 是否可以接受?加密模式或填充会导致这种不安全吗?我假设这不是一个好的做法,因为我以前从未见过它的建议,但因为它会非常方便,我想我会问。

(请注意,散列值已经是工具中的一个选项。现在也在考虑加密,因为这些值是可逆的,这使得客户的报告分析更简单一些。)

不,这不是一个好的选择。特别是对于电子邮件地址,如果这样做的话,密文很可能会部分相同。这会泄露信息,例如,一旦重复这些名称或服务器地址,您就可以轻松猜出它们。

如果您真的需要确定性加密,您可以在 Synhetic IV (SIV) 模式下使用 AES。这将创建一个密文,其中输出的每一位完全依赖于输入的 every 位。或者,如果 space 是稀疏的,则可以使用格式保留加密 (FPE)。


我当然希望您使用密码散列(例如 bcrypt、scrypt、PBKDF2 或 Argon2)来派生密钥,否则您的密钥可能没有您想象的那么安全。

相同的数据需要相同的 IV。对所有数据使用常量 IV 是不安全的,因此您将不得不从明文数据中导出 IV。

使用密码的哈希值也会得到一个固定的 IV。

我建议使用明文的前 16 个(或其他)字节的哈希值。您可能还想在散列之前添加一些固定的额外字节。

显然,如果您希望能够解密数据,则需要将 IV 与密文一起存储。

由于 IV 是从明文(可能还有一些额外的固定字节)派生的,因此相同的明文将导致相同的 IV。在密文中添加或附加 IV 仍然会导致相同输入的相同输出。