首页 文章

将密码哈希从md5升级到bcrypt [关闭]

提问于
浏览
8

之前已在此讨论过,但似乎没有结论 .

理想情况下,不想在数据库等中维护状态(升级/未升级),所以,这就是我的想法:

bcrypt MD5的密码,并使用“username something else”作为盐 .

  • 这个方案有意义吗?

  • 另外,一般来说,最好使用用户名作为盐的一部分吗?我在某处读到,为每个哈希添加不同的盐使其更安全 . 这是正确的(特别是在bcrypt的背景下)?

1 回答

  • 6

    当然,切换到更安全的哈希算法是个好主意 . 您可以使用函数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()函数将处理此问题 . 由于必须在每个盐之前构建一个rainbowtable,攻击者必须为每个密码构建一个rainbowtable . 有关更多信息,您可以查看我的关于secure password storing的教程 .

相关问题