Security 使用密码哈希加密私钥

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

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

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


谢谢你的帮助。

建议:使用两种不同的盐。当用户输入密码时,将其与随机salt连接,并将其散列以用于密码识别例程。使用不同的salt并再次对AES加密密钥进行散列。根据所需内容的安全程度,还可以扩展散列

实际上,你有:

storedPasswordCheck = SHA256(password + salt1);

AESkey = SHA256(password + salt2);

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

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

我建议在这种情况下使用。您可以使用两种不同的salt,一种派生对称密钥,另一种派生要存储的密码散列。salt应包含区分两个不同用例的确定部分,以及随机部分-参见本注释:

否则,salt应该包含显式 区分不同的操作和不同的键 长度,以及至少为8的随机零件 八位字节长,此数据应由 接受盐的一方。例如,盐可能会 一个附加的非随机八位组,用于指定 派生密钥。或者,它可以是 结构,该结构指定有关派生对象的详细信息 密钥,如加密或身份验证技术和 从中派生的不同键之间的序列号 密码。附加数据的特定格式保留 对应用程序进行修改


正如评论中提到的那样,由于典型密码的熵很差,一个简单的、盐渍的SHA-2可能是不够的

如果这里没有人能给你一个明确的答案,你可能想试试(很抱歉删除了评论,我误读了你的答案;+1)--但我要提到的是,对源密码应用哈希转换不会给你比直接在哈希中使用用户密码所获得的更多的安全性。也就是说,哈希函数不能产生比用户原始密码更多的熵。(这适用于任何散列函数)我几乎不认为你需要AES密钥上的盐——密码仍然不是以明文形式保存的。密码并不总是安全的,用户倾向于选择他们能记住的东西。一个加盐的、散列的(可能是拉伸的)密码将没有那么多弱点。对于安全来说,轻微的过度杀伤力并不是坏事。它怎么会有更少的弱点呢?salt是使从散列中恢复密码变得困难。但是散列不是存储在这里的,它只是作为AES的输入。人们会选择可猜测的密码:“secret”,qwertyuiop,“password123”“。他们还将选择值得记忆的密码,这些密码很容易在字典中尝试所有单词。存在利用这些漏洞的密码破解程序。散列可以防止这种情况,salt可以防止预先准备好的rainbow表和其他离线攻击的简单使用。拉伸可以尽可能地减缓任何攻击者的速度。