php password_hash和password_verify不匹配

时间:2013-11-08 09:36:23

标签: php passwords php-password-hash

我正在尝试从PHP 5.5中调用一个名为password_hash()的新函数。

无论我做什么,$ hash和$ password都不匹配。

$password = "test";

$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";



if (password_verify($password, $hash)) {
    echo "Success";
}
else {
    echo "Error";
}

3 个答案:

答案 0 :(得分:37)

代码的问题在于,在处理哈希时,您使用双引号"而不是单引号'

分配时:

$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";

它让php认为你有一个名为$2y的变量和另一个名为$10的变量,最后是第三个名为$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e的变量。显然情况并非如此。

我在启用错误报告时注意到错误:

  

注意:未定义的变量:fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e

被PHP抛出。

将所有双引号替换为单引号以修复。

E.g

$hash = '$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e';

将整个哈希视为文字字符串,而不是带有嵌入变量的字符串。

答案 1 :(得分:7)

我遇到了与password_verify()类似的问题。在我的情况下,我的错误就是我在数据库中将我的密码字段声明为varchar(30),但是散列等于或长于60个字符。

答案 2 :(得分:4)

对我来说很好。

<?php

$hash=password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

<强>输出:

  

密码有效!