有没有办法将 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/