PHP password_verify() 哈希和传递不匹配


php password_verify() hash and pass won't match

我将密码存储在使用 password_hash(( 散列的数据库中,并且我正在尝试使用 password_verify(( 验证登录时的密码。出于某种原因,password_verify(( 不断返回 false。

我阅读了有关此函数的文档,它说要确保函数中使用的哈希值在单引号之间,否则它会像三个变量一样读取哈希,因为 $',所以我尝试编写这样的$valid"$valid"。但这没有用。

当我回显$valid输出是$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT

当我回显$check时,输出是123,这是用于创建帐户的密码。

这是我登录的一部分.php,这就是我觉得问题所在。

$emailLogin = mysqli_real_escape_string($con, $_POST['emailLogin']);
$passLogin = mysqli_real_escape_string($con, $_POST['passLogin']);
$query = "SELECT `pass` FROM `user` WHERE `email`='$emailLogin'";
$result = mysqli_query($con, $query);
$row = mysqli_fetch_array($result);
$pass = $row['pass']; 
$key = VUP($passLogin, $pass);

这是我验证的一部分.php

function VUP($check, $valid){
if (password_verify($check, $valid)) {
$key = 1;
} else {
echo 'Invalid password.';
$key = 0;
die();
}
return $key;
}

也是验证的一部分.php

function SHP($password){
$hash = password_hash('$password', PASSWORD_BCRYPT);
return $hash;
}

任何建议都会非常有帮助。

"当我回显$valid输出是 $2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT">

$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT哈希只有50长度并且无效/太短,正如我所说,MySQL将静默失败; 错误报告/检查在这里无济于事。

密码的列长度应为 60(建议为 255(,因此最初未正确存储。

您需要清除密码列/或表,增加列的长度,然后重新开始。

参考:

  • http://php.net/manual/en/function.password-hash.php

"因此,建议将结果存储在可以扩展到 60 个字符以上的数据库列中(255 个字符将是一个不错的选择(。


您还可以将查询修改为:

$con = new mysqli("xxx", "xxx", "xxx", "xxx");
if ($con->connect_error) {
    die('Connect Error (' . $con->connect_errno . ') '
            . $con->connect_error);
}
$query = "SELECT `pass` FROM `user` WHERE `email`='$emailLogin'";
$result = $con->query($query);
// error checking on the query
if (!$result) {
    echo "<p>There was an error in query: $query</p>";
    echo $con->error;
}
$row_hash = $result->fetch_array();
if (password_verify($passLogin, $row_hash['pass'])) {
    echo "Success!";
}

编辑:

从我留给OP的评论中添加:

您的验证函数需要与您的数据库建立连接,这就是我认为这里正在发生的事情(可变范围(。因此,您需要使用 global $con; 或将连接(变量(传递给您的函数(在大多数情况下更好(。

我不知道您是否正在为该功能做"包含",如果是这样,那么这就是另一个问题所在。

即:function VUP($con, $check, $valid){function VUP($check, $valid){ global $con; - 尝试两者。使用$result = mysqli_query($con, $query) or die(mysqli_error($con));而不是您现在拥有的那个。