我正在开发中,我需要加密敏感信息的Web应用程序。 我的计划是使用使用AES-256,其中私钥由用户密码的哈希加密。 我需要存储的密码用于认证目的的哈希值,但它显然不能同用于加密私钥。 我现在的想法是使用bcrypt生成一个密钥被用来加密私钥。 为了验证,我的想法是只使用bcrypt哈希密码,然后再使用散列是bcrypt哈希值,然后存储在数据库中的哈希值。 由于它是单向的,不应该有任何的方式来使用存储的散列解密私钥? 是否有与这样做,我可能会丢失任何明显的安全问题?
我的另一个想法是使用两个不同的加密算法,如使用bcrypt哈希加密私钥和存储SHA-2散列用于认证目的。
谢谢你的帮助。
不要用哈希加密AES密码。 盐渍哈希应该只用于身份验证使用。 当用户登录时,你有他的密码。 使用此密码来加密(第一次)和解密(后来)AES密钥,然后忘记了密码。
我推荐使用PBKDF2在这种情况下。 您可以使用两种不同的盐,一个会获得对称密钥和其他人会获得密码哈希存储。 盐应包含一个确定性的部分区分这两种不同的使用情况,以及一个随机部分 - 比照 此评论:
否则,该盐应包含不同的操作和不同的密钥长度之间明确区分,除了至少是8个八位字节长的一个随机部分数据,并且该数据应当由一方接收的盐进行检查或再生。 例如,所述盐可以具有另外的非随机的字节,用于指定导出密钥的目的。 或者,它可能是指定关于导出密钥,诸如加密或认证技术,并从密码导出的不同密钥之间的序列号的详细信息的结构的编码。 附加数据的具体格式留给应用。
平原,盐渍SHA-2可能是不够的,因为典型的密码的熵差,因为在评论中提到。
一个建议:使用两种不同的盐。 当用户输入自己的密码与随机盐串连,并散列它为密码识别程序。 使用不同的盐,再散列它的AES加密密钥。 这取决于你如何安全的想要的东西,你可以舒展散列为好。
切实您有:
storedPasswordCheck = SHA256(password + salt1);
AESkey = SHA256(password + salt2);
该AES密钥不存储,当然,不过,需要从用户的密码再生。 则需要两个单独的盐,每一个最好至少128位,为每个用户存储。