使用密码散列加密私钥(Using hash of password to encrypt priva

2019-09-20 19:37发布

我正在开发中,我需要加密敏感信息的Web应用程序。 我的计划是使用使用AES-256,其中私钥由用户密码的哈希加密。 我需要存储的密码用于认证目的的哈希值,但它显然不能同用于加密私钥。 我现在的想法是使用bcrypt生成一个密钥被用来加密私钥。 为了验证,我的想法是只使用bcrypt哈希密码,然后再使用散列是bcrypt哈希值,然后存储在数据库中的哈希值。 由于它是单向的,不应该有任何的方式来使用存储的散列解密私钥? 是否有与这样做,我可能会丢失任何明显的安全问题?

我的另一个想法是使用两个不同的加密算法,如使用bcrypt哈希加密私钥和存储SHA-2散列用于认证目的。

谢谢你的帮助。

Answer 1:

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



Answer 2:

我推荐使用PBKDF2在这种情况下。 您可以使用两种不同的盐,一个会获得对称密钥和其他人会获得密码哈希存储。 盐应包含一个确定性的部分区分这两种不同的使用情况,以及一个随机部分 - 比照 此评论:

否则,该盐应包含不同的操作和不同的密钥长度之间明确区分,除了至少是8个八位字节长的一个随机部分数据,并且该数据应当由一方接收的盐进行检查或再生。 例如,所述盐可以具有另外的非随机的字节,用于指定导出密钥的目的。 或者,它可能是指定关于导出密钥,诸如加密或认证技术,并从密码导出的不同密钥之间的序列号的详细信息的结构的编码。 附加数据的具体格式留给应用。

平原,盐渍SHA-2可能是不够的,因为典型的密码的熵差,因为在评论中提到。



Answer 3:

一个建议:使用两种不同的盐。 当用户输入自己的密码与随机盐串连,并散列它为密码识别程序。 使用不同的盐,再散列它的AES加密密钥。 这取决于你如何安全的想要的东西,你可以舒展散列为好。

切实您有:

storedPasswordCheck = SHA256(password + salt1);

AESkey = SHA256(password + salt2);

该AES密钥不存储,当然,不过,需要从用户的密码再生。 则需要两个单独的盐,每一个最好至少128位,为每个用户存储。



文章来源: Using hash of password to encrypt private key