18

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

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

$password = "test";

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



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

3 回答 3

52

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

分配时:

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

它使 php 认为您有一个名为的变量$2y和另一个名为的变量$10,最后是第三个名为$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e. 显然不是这样。

我在打开错误报告时注意到错误:

注意:未定义变量:fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e

被PHP抛出。

用单引号替换所有双引号以进行修复。

例如

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

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

于 2013-11-08T10:16:04.707 回答
11

我遇到了类似的问题password_verify()

就我而言,错误是我已将数据库中的密码字段声明为varchar(30),但哈希值等于或长于 60 个字符。

于 2014-08-30T13:48:07.840 回答
8

对我来说很好。

<?php

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

输出:

密码有效!

于 2013-11-08T09:40:11.633 回答