我有一个应用程序,其中敏感数据需要以每次运行从相同输入产生相同加密值的方式进行加密。主要数据类型是电子邮件地址。加密值必须始终相同,因为它们匹配用于统计分析。产生数据的运行将在很长一段时间内定期发生。这使得为AES加密选择IV有点棘手。问题是:使用秘密(给定密码的散列)也可以作为IV吗?加密模式或填充会使这种不安全吗?我认为这不是一个很好的做法,因为我以前从未见过这个做法,但是因为我觉得这很方便我会问。
(请注意,散列值已经是工具中的一个选项。现在也在考虑加密,因为这些值是可逆的,这使得客户的报告分析更加简单。)
答案 0 :(得分:4)
不,这不是一个好选择。特别是对于电子邮件地址,如果你这样做,密文很可能部分相同。这将泄露信息,例如,一旦重复这些信息,您就可以轻松猜出名称或服务器。
如果您确实需要确定性加密,则可以在 Synhetic IV(SIV)模式下使用AES。这将创建一个密文,其中每个输出位完全依赖于输入的每个位。或者,如果空间稀疏,则可以使用格式保留加密(FPE)。
我当然希望您使用密码哈希(例如bcrypt,scrypt,PBKDF2或Argon2)来获取密钥,否则您的密钥可能不如您想象的那么安全。
答案 1 :(得分:-1)
您需要为相同的数据使用相同的IV。对所有数据进行常数IV是不安全的,因此您将不得不从明文数据中导出IV。
使用密码的散列也会给出一个固定的IV。
我建议使用明文的前16个(或其他)字节的散列。您可能希望在散列之前添加一些固定的额外字节。
如果您希望能够解密数据,显然您需要将IV与cyphertext一起存储。
由于IV来自明文(可能还有一些额外的固定字节),因此相同的明文将产生相同的IV。将IV添加到密文之前或将其附加到密文仍将导致相同输入的相同输出。