将密码哈希从 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 [关闭]

如何将密码文本与 bcrypt 哈希值进行比较?

带有 BCrypt 哈希的 AES 256。如何从数据库中检查用户密码? [复制]

基于令牌的身份验证和哈希密码

spring security使用哈希加密的密码