我正在改进一个 CMS,其中当前存储密码的实现只是sha1(password)
. 我向我的老板解释说这样做非常不安全,并告诉他我们应该改用 bcrypt,他同意了。
我的计划是通过 bcrypt 运行所有现有哈希并将其存储在密码字段中,然后使用以下伪代码检查密码correctPassword = bcrypt_verify(password, storedHash) or bcrypt_verify(sha1(password), storedHash)
:
这样,新用户或更改密码的用户将获得“真正的”bcrypt 哈希,而现有用户不必全部更改密码。这样做有什么缺点吗?虽然要求所有用户选择一个新密码可能是理想的,但这样做是否会在安全性方面损失很多?
我在想,即使攻击者可以同时访问数据库和代码,即使 bcrypt 的大部分“输入”是 40 个字符的十六进制字符串,破解也不会快得多,因为慢速部分 ( bcrypt_verify()
) 仍然必须为每个用户的每次密码尝试调用。