1

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

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

4

2 回答 2

4

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

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


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

于 2017-08-06T00:42:00.200 回答
-1

对于相同的数据,您需要具有相同的 IV。为所有数据设置一个常量 IV 是不安全的,因此您将不得不从明文数据中导出 IV。

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

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

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

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

于 2017-08-07T11:12:54.783 回答