我正在尝试从PHP 5.5中调用一个名为password_hash()的新函数。
无论我做什么,$ hash和$ password都不匹配。
$password = "test";
$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";
if (password_verify($password, $hash)) {
echo "Success";
}
else {
echo "Error";
}
答案 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.';
}
?>
<强>输出:强>
密码有效!