使用密码哈希来加密私钥



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

我的另一个想法是使用两种不同的加密算法,例如使用bcrypt哈希来加密私钥,以及存储SHA-2哈希用于身份验证。

谢谢你的帮助。

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

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

否则,salt应该包含明确区分不同的操作和不同的键长度,除了至少为8的随机部分八位字节长,并且该数据应由收到盐的一方。例如,盐可能指定派生密钥。或者,它可以是结构,该结构指定有关派生密钥,例如加密或身份验证技术和从暗语保留了附加数据的特定格式应用程序。

正如评论中提到的那样,一个简单的SHA-2可能是不够的,因为典型密码的熵很低。

建议:使用两种不同的盐。当用户输入他们的密码时,将其与随机盐连接,并将其散列以用于密码识别例程。使用不同的salt,然后再次对其进行哈希以获得AES加密密钥。根据你想要的东西的安全程度,你也可以扩展哈希。

实际上你有:

storedPasswordCheck = SHA256(password + salt1);
AESkey = SHA256(password + salt2);

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

最新更新