关于加密:使用密码生成两个不同的哈希,而不会降低密码安全性

Using a password to generate two distinct hashes without reducing password security

我正在设计一个需要在数据库中以加密格式存储GPG密钥的Web应用程序。

我计划将用户的密码存储在数据库中的bcrypt散列中。我希望能够做的是使用该bcrypt对用户进行身份验证,然后使用存储的bcrypt哈希和密码的另一个哈希的组合来加密和解密GPG密钥。

我的问题是我是否可以在不降低密码安全性的情况下做到这一点?我在想,我可能可以使用类似hmac-sha256的静态字符串,使用密码和salt作为密钥。

有没有更好的方法可以做到这一点,我没有想到?

谢谢


考虑使用pbkdf2(来自pkcs 5)。它接受作为密码、salt和迭代计数的输入。迭代计数指定密码短语应重复散列的次数;为此使用较大的数字(通常为1000到10000)有助于使密码猜测攻击更加困难。salt导致对同一密码短语的不同使用,以创建不同的键。

由于pbkdf2的设计,即使您知道由相同的密码短语为不同的salt生成的哈希,也很难猜测用一个salt生成的哈希。

PBKdf2已经实现,在大多数的加密注库中都是现成的。例如,它在openssl(header evp.h中以PKCS5_PBKDF2_HMAC_SHA1的形式提供。


如果您总是要解密GPG密钥,那么您可以保存用该密钥加密的已知值,并使用该值来验证用户密码(即,如果输入了正确的用户密码,则解密的GPG密钥将存储的数据解密为已知值)。

使用标准的密钥派生算法从密码生成密钥,您的加密库应该包括一个。