6

我正在开发一个需要加密敏感信息的 Web 应用程序。我的计划是使用 AES-256,其中私钥由用户密码的哈希加密。我需要存储密码的哈希值以进行身份​​验证,但它显然不能用于加密私钥。我目前的想法是使用 bcrypt 生成用于加密私钥的密钥。对于身份验证,我的想法是简单地使用 bcrypt 散列密码,然后再次使用 bcrypt 散列该散列,然后将该散列存储在数据库中。既然是一种方式,就不应该有任何方式使用存储的哈希来解密私钥吗?这样做是否有任何我可能遗漏的明显安全问题?

我的另一个想法是使用两种不同的加密算法,例如使用 bcrypt 散列来加密私钥并存储 SHA-2 散列以进行身份​​验证。

谢谢你的帮助。

4

3 回答 3

2

我建议在这种情况下使用PBKDF2 。您可以使用两种不同的盐,一种会派生对称密钥,另一种会派生要存储的密码哈希。盐应该包含区分两个不同用例的确定性部分,以及随机部分 - cf。这条评论:

否则,salt 应包含明确区分不同操作和不同密钥长度的数据,以及至少 8 个八位字节长的随机部分,并且该数据应由接收 salt 的一方检查或重新生成。例如,盐可能有一个额外的非随机八位组,用于指定派生密钥的用途。或者,它可以是指定有关派生密钥的详细信息的结构的编码,例如加密或身份验证技术以及从密码派生的不同密钥之间的序列号。附加数据的特定格式留给应用程序。

正如评论中提到的那样,由于典型密码的熵差,普通的加盐 SHA-2 可能还不够。

于 2012-08-06T07:52:56.847 回答
2

不要使用哈希来加密 AES 密码。salted hash 应该只用于身份验证。当用户登录时,您有他的密码。使用此密码加密(第一次)和解密(稍后)AES 密钥,然后忘记密码。

于 2012-08-04T20:54:52.653 回答
1

一个建议:使用两种不同的盐。当用户输入他们的密码时,将其与随机盐连接并散列以用于密码识别例程。使用不同的盐并再次对 AES 加密密钥进行哈希处理。根据您想要的安全程度,您也可以拉伸散列。

实际上你有:

storedPasswordCheck = SHA256(password + salt1);

AESkey = SHA256(password + salt2);

AES 密钥当然不会被存储,而是根据需要从用户的密码中重新生成。您将需要为每个用户存储两个单独的盐,最好每个至少 128 位。

于 2012-08-04T16:30:01.173 回答