我正在开发一个Web应用程序,我需要在其中加密敏感信息。我的计划是使用AES-256,其中私钥由用户密码的哈希加密。我需要存储密码的哈希值以进行身份验证,但显然不能用于加密私钥。我目前的想法是使用bcrypt生成用于加密私钥的密钥。对于身份验证,我的想法是简单地使用bcrypt散列密码,然后再次使用bcrypt散列该散列,然后将该散列存储在数据库中。既然它是单向的,那么应该没有办法使用存储的哈希来解密私钥?这样做有什么明显的安全问题我可能会丢失吗?
我的另一个想法是使用两种不同的加密算法,例如使用bcrypt哈希来加密私钥并存储SHA-2哈希以进行身份验证。
感谢您的帮助。
答案 0 :(得分:2)
不要使用哈希来加密AES密码。 salted hash只能用于身份验证。当用户登录时,您有他的密码。使用此密码加密(第一次)并解密(稍后)AES密钥,然后忘记密码。
答案 1 :(得分:2)
我建议在这种情况下使用PBKDF2。您可以使用两种不同的盐,一种可以派生对称密钥,另一种可以导出要存储的密码哈希值。盐应包含区分两种不同用例的确定性部分,以及随机部分 - 参见这个评论:
否则,salt应该包含显式的数据 区分不同的操作和不同的键 长度,除了至少为8的随机部分 八位字节长,应检查或重新生成此数据 接受盐的党。例如,盐可以 一个额外的非随机八位字节,用于指定目的 派生密钥。或者,它可以是a的编码 结构,指定有关派生的详细信息 密钥,例如加密或认证技术和 从中导出的不同密钥中的序列号 密码。剩下附加数据的特定格式 申请。
普通的盐渍SHA-2可能是不够的,因为典型密码的熵很差,正如评论中提到的那样。
答案 2 :(得分:1)
建议:使用两种不同的盐。当用户输入他们的密码时,用随机盐连接它并将其哈希用于密码识别例程。使用不同的 salt并再次将其哈希为AES加密密钥。根据您想要的安全性,您也可以延长散列。
实际上你有:
storedPasswordCheck = SHA256(password + salt1);
AESkey = SHA256(password + salt2);
当然不会存储AES密钥,但会根据需要从用户的密码重新生成。您将需要两个单独的盐,每个盐最好至少128位,为每个用户存储。