我正在设计一个Web应用程序,需要在数据库中以加密格式存储GPG密钥。
我打算将用户密码存储在数据库中的bCrypt哈希中。我希望能够做的是使用该bCrypt对用户进行身份验证,然后使用存储的bCrypt哈希和密码的另一个哈希的组合来加密和解密GPG密钥。
我的问题是我是否可以在不降低密码安全性的情况下执行此操作?我以为我可以使用密码和盐作为密钥来使用静态字符串的HMAC-SHA256。
有没有更好的方法来做到这一点,我没有想过?
由于
答案 0 :(得分:2)
考虑使用PBKDF2(来自PKCS #5)。它作为密码,盐和迭代计数的输入。迭代计数指定密码短语应重复散列的次数;使用大量数字(1000到10000是常见的)有助于使密码猜测攻击更难。盐导致相同密码短语的不同用途,以创建不同的密钥。
由于PBKDF2的设计,即使您知道由不同盐的相同密码短语生成的哈希值,也很难猜测用一个盐生成的哈希值。
PBKDF2已经实现,并且在大多数值得注意的加密库中都可以直接使用。例如,它在OpenSSL中可用PKCS5_PBKDF2_HMAC_SHA1
(标题evp.h
)。
答案 1 :(得分:0)
如果您总是要解密GPG密钥,那么您可以保留使用密钥加密的已知值,并使用该密钥验证用户密码(即,如果输入了正确的用户密码,则解密的GPG密钥将解密存储的数据到已知值)。
使用标准密钥派生算法从密码生成密钥,加密库应包含密码。