将密码哈希从 md5 升级到 bcrypt [关闭]
Posted
技术标签:
【中文标题】将密码哈希从 md5 升级到 bcrypt [关闭]【英文标题】:Upgrade password hash from md5 to bcrypt [closed] 【发布时间】:2014-11-24 14:11:30 【问题描述】:这里已经讨论过,但似乎没有结论。
理想情况下,不想在数据库等中维护状态(升级/未升级)所以,这就是我的想法:
bcrypt MD5 的密码,并使用“用户名 + 其他”作为盐。
-
这个方案有意义吗?
另外,一般来说,使用用户名作为 salt 的一部分是否是个好主意?我在某处读到,为每个哈希添加不同的盐使其更安全。这是正确的(尤其是在 bcrypt 的情况下)?
【问题讨论】:
请解释否决票 这更适合Information Security,但在发帖之前请查看他们的帮助中心。 签出password_hash()
php.net/manual/en/function.password-hash.php
@Tim 我做了 - 我想知道 password_hash(MD5'd password + username + "fixed random string") 是不是个好主意?
@user3714828 password_hash()
创建自己的盐,因此您不必为用户名而烦恼。
【参考方案1】:
当然,切换到更安全的哈希算法是个好主意。有一个函数 password_hash() 可用于创建 BCrypt 哈希:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
根据您的回答,我猜您使用了未加盐的 MD5 值,因此双散列在这里可能是一个很好的解决方案。只需将 MD5 哈希传递给 password_hash() 函数,它就会自行生成一个安全的盐。
// Migrating the old MD5 hashes to MD5-BCrypt
$hashToStoreInDb = password_hash($existingMd5Hash, PASSWORD_DEFAULT);
先验证check for a double hash,再验证密码。
if (checkIfDoubleHash($existingHashFromDb))
$isPasswordCorrect = password_verify(MD5($password), $existingHashFromDb);
// Update database with pure BCrypt hash
if ($isPasswordCorrect)
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
else
$isPasswordCorrect = password_verify($password, $existingHashFromDb)
存储的哈希值可以通过前导 $ 或单独的 db 字段来识别,例如 BCrypt 哈希值总是以 $ 字符开头,而 MD5 哈希值则不是。
盐应该不来自其他参数,并且每个密码应该是唯一的。 password_hash() 函数会处理这个问题。由于必须为每个盐构建一个彩虹表,因此攻击者必须为每个密码构建一个彩虹表。有关更多信息,您可以查看我关于 secure password storing 的教程。
【讨论】:
这很有用。谢谢!以上是关于将密码哈希从 md5 升级到 bcrypt [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
SHA512 与 Blowfish 和 Bcrypt [关闭]