0

如何使用密码和盐进行 AES 加密,以便我可以在 Java 中仅使用相同的密码和盐进行解密。我需要这个,因为我想在将数据放入数据库之前对其进行加密,并且我不想在数据库中存储任何 IV 字节数组以进行解密。我只想使用密码加密数据,salt 将加密的数据存储在数据库中,以便当我需要数据时,我从数据库中获取数据并使用相同的密码和 salt 对其进行解密,仅此而已。

4

2 回答 2

1

AES是一种分组密码,以 16 字节为单位进行加密。如果您使用相同的密钥(或密码 + salt)加密相同的 16 字节数据,您最终将得到相同的加密数据。这具有初始化向量用于解决的一些不良(不安全)属性。

如果您不想跟踪初始化向量,则可以改为将数据的前 16 个字节设为随机,然后使用设置为 16 个零的初始化向量。这将产生相同的效果。

于 2013-04-26T20:17:12.490 回答
0

我能想到两种可能:

  1. 使用 AES-CTR。计数器模式不需要 IV。

  2. 从您的密码和盐中导出您的密钥和 IV。就像是:

    key <- hash(密码 + salt + "KEY")

    IV <- 哈希(密码 + 盐 + “IV”)

显然,在现实生活中,您将使用标准的密钥派生函数,具体取决于您需要多少安全性。

您可能还希望考虑进行身份验证以检查从数据库返回的内容是否与您放在那里的内容相同。对于内置身份验证,请使用 AES-GCM 而不是 AES-CTR,或者如果您使用第二个选项,请添加 HMAC。

于 2013-04-28T12:03:09.533 回答