想象一下,我有一个带有用户帐户的网站。我想对用户进行身份验证,所以我需要知道他们提供的密码是否与存储在我的数据库中的密码匹配。为了保护密码不被窥探,我想混淆它们,我决定在 CBC 模式下使用 AES 来做到这一点。
我知道我不应该使用 AES-CBC 来执行此操作,并且可能应该使用散列算法而不是加密算法,但是请忽略这个事实。如果你这样做,它将帮助我更好地理解事情。
使用 AES-CBC 加密用户密码以将其存储在我的数据库中时,我是否需要使用密钥、IV 和 Salt?无论我需要使用什么,它们将如何使用?
我将举一个例子来更好地解释我的问题:
用户名为“bob”的用户使用密码“mypass”注册
我需要确定使用 AES-CBC 混淆此密码的最安全方法是什么。
现在我认为要做到这一点,我需要使用 CSPRNG[1] 生成一个 16 字节的盐。比我必须在盐前面加上用户密码:salt+“mypass”。我必须使用 AES-CBC 加密 salt+“mypass”,我将使用硬编码的 256 位密钥和随机生成的 16 字节 IV。
实际上我有: AesEncrypt(salt+"mypass", GenerateIv(), Key)
鉴于这个例子,我有几点让我感到困惑。
1)我传递给 AES 的随机 IV 将产生没有两个“mypass”给出相同密文的效果。这不会使加盐变得多余,因为加盐的目的是防止“mypass”的两个密文相同?
2)相反,IV是否是多余的,我可以只传入零IV或恒定IV,因为我正在加盐我的密码?
3)说IV和salt不是多余的,因为不知何故我读到并没有真正理解IV是XORed而不是salt,因此两者都很有用。我只需在“mypass”前面加上盐就可以适当加盐了吗?
4)我是否应该以某种方式使用盐来派生我将用于使用 AES 加密“mypass”的密钥?或者我只是通过使用硬编码的密钥来做对了吗?
5) 我应该在我的数据库中存储什么?盐、iv 和密文应该都存储在单独的列中,还是应该以某种方式组合在一起,如果是这样,简单的连接就足够了,还是必须与特殊功能组合?
6)我完全错了,如果是,我应该怎么做?
谢谢。
==============
[1] 密码安全的伪随机数生成器