如何使用密码和salt进行AES加密,以便我只能使用Java中的相同密码和salt进行解密。我需要这个,因为我想在将数据放入数据库之前对其进行加密,并且我不想在数据库中存储任何IV字节数组以进行解密。我只是想使用密码加密数据,盐将加密数据存储在数据库中,这样当我需要数据时,我从数据库中获取数据并使用相同的密码和盐解密它,仅此而已。
答案 0 :(得分:1)
AES 是一种以16字节为单位加密的分组密码。如果使用相同的密钥(或密码+ salt)加密相同的16字节数据,则最终将使用相同的加密数据。这有一些不受欢迎(不安全)的属性,初始化向量用于解决。
如果您不想跟踪初始化向量,您可以改为数据的前16个字节,然后使用初始化矢量设置为16零。这将产生同样的效果。
答案 1 :(得分:0)
我可以想到两种可能性:
使用AES-CTR。计数器模式不需要IV。
从密码和盐中获取密钥和IV。类似的东西:
key< - hash(password + salt +“KEY”)
IV< - hash(密码+盐+“IV”)
显然,在现实生活中,您将使用标准密钥派生函数,具体取决于您需要多少安全性。
您可能还希望考虑身份验证,以检查从数据库返回的内容与您放在那里的内容相同。对于内置身份验证,请使用AES-GCM而不是AES-CTR,否则在使用第二个选项时添加HMAC。