php - 使用 password_verify() 验证 MD5 密码

标签 php hash passwords php-password-hash

有没有办法将 MD5 密码转换为可以通过 password_verify() 验证的密码?

我在 Crypt Wikipedia page 上阅读“MD5 密码散列的可打印形式以 $1$ 开头。”

因此我试一试(没有任何运气):

$password = "abcd1234";
$md5hash = "$1$".md5($password);
var_dump(password_verify($password, $md5hash));

有什么方法可以使 password_verify() 使用 MD5 密码吗?

提问原因:我有一个旧系统,其中密码存储为 MD5 哈希。我想开始使用更安全的 Password Hashing API .如果我能够将现有的密码哈希值转换为适用于 password_verify() 的东西,我可以只更新数据库条目(在所有密码哈希值前加上 $1$) ,我的程序将使用以下代码完美地工作(我不必为旧的 MD5 密码做一个特例):

$password; // Provided by user when trying to log in
$hash; // Loaded from database based on username provided by user
if(password_verify($password, $hash)) {
   // The following lines will both update the MD5 passwords
   // and all passwords whenever the default hashing algorithm is updated
   if(password_needs_rehash($hash, PASSWORD_DEFAULT)) {
      $hash = password_hash($password, PASSWORD_DEFAULT);
      // Store the new hash in database
   }
   // User is logged in
} else {
   // User is not logged in
}

最佳答案

你不能那样做。

您可以做的是通过 password_hash()已经经过 MD5 哈希处理 的密码进行哈希处理,并在您的数据库中为这些旧密码添加一个额外的标志,这样您就知道之后对它们进行双重验证。

一些示例代码:

$passwordCompare = ($passwordIsOldFlag === true)
    ? md5($passwordInput)
    : $passwordInput;

if (password_verify($passwordCompare, $passwordHash))
{
    if ($passwordisOldFlag === true)
    {
        $passwordNewHash = password_hash($passwordInput, PASSWORD_DEFAULT);

        // Here, you'd update the database with the new, purely bcrypt hash
        // and set your passwordIsOldFlag to 0 as well
    }
}

注意:MD5 生成 32 个字符长度的字符串,而 password_hash() 最少为 60。

阅读手册:

如果您决定使用 password_hash() 或兼容包(如果 PHP < 5.5)https://github.com/ircmaxell/password_compat/ ,重要的是要注意,如果您当前的密码列的长度低于 60,则需要将其更改为该值(或更高)。手册建议长度为 255。

您需要更改列的长度并使用新的散列重新开始才能生效。否则,MySQL 将无提示地失败。

关于php - 使用 password_verify() 验证 MD5 密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31721348/

相关文章:

php - 在 php 中使用 preg_match 验证密码

php - 获取解析错误 : syntax error, 意外 T_NEW

php切割多维数组

php - 我应该为 password_hash() 使用什么列字符编码?

php - 带有准备好的语句的 PDO bindParam() 不起作用

c - 使用 SuperFastHash 而不是 CRC32?

c# - 如何在 C# 中实现 sdbm 哈希函数?

arrays - 如何在 Rails 5/Postgres 中查询 jsonb 散列元素数组以查找缺少的键/值对

ruby-on-rails - 将密码作为环境变量(而不是纯文本)存储在配置文件中是否安全?

java - 从 Spring Boot 应用程序检查密码是否在 Keycloak 中有效