php密码\u verify()哈希和pass不匹配

php密码\u verify()哈希和pass不匹配,php,mysql,mysqli,truncate,Php,Mysql,Mysqli,Truncate,我用password\u hash将我的密码存储在我的数据库中,并尝试在登录时用password\u verify验证密码。由于某些原因,密码验证一直返回false 我阅读了关于这个函数的文档,它说要确保函数中使用的散列在单引号之间,否则由于$的原因,它会像读取三个变量一样读取散列,所以我尝试像这样编写$valid“$valid”。但那没用 当我回显$valid时,输出为$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT 当我echo$check

我用password\u hash将我的密码存储在我的数据库中,并尝试在登录时用password\u verify验证密码。由于某些原因,密码验证一直返回false

我阅读了关于这个函数的文档,它说要确保函数中使用的散列在单引号之间,否则由于$的原因,它会像读取三个变量一样读取散列,所以我尝试像这样编写$valid“$valid”。但那没用

当我回显$valid时,输出为$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT

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

这是我login.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);
这是我的verify.php的一部分

function VUP($check, $valid){

if (password_verify($check, $valid)) {
$key = 1;

} else {
echo 'Invalid password.';
$key = 0;
die();
}
return $key;

}
function SHP($password){

$hash = password_hash('$password', PASSWORD_BCRYPT);

return $hash;

}
也是verify.php的一部分

function VUP($check, $valid){

if (password_verify($check, $valid)) {
$key = 1;

} else {
echo 'Invalid password.';
$key = 0;
die();
}
return $key;

}
function SHP($password){

$hash = password_hash('$password', PASSWORD_BCRYPT);

return $hash;

}
任何建议都会很有帮助

当我回显$valid时,输出为$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT

$2y$10$ZZCN7ULUKVY2SKB3ELVP.4y3Oc7NJTEsFyqdstqYxT哈希长度只有50,并且无效/太短,正如我所说,MySQL将以静默方式失败;错误报告/检查在这里没有帮助

建议密码的列长度应为60 255,因此它最初没有正确存储

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

参考:

因此,建议将结果存储在可扩展到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留下的评论中添加:

您的verify函数需要与数据库建立连接,这就是我觉得在变量范围内发生的事情。因此,您需要使用global$con;或者将连接变量传递给函数,这在大多数情况下更好

我不知道你是否在做函数的include,如果是的话,那么这就是另一个问题


即:函数VUP$con、$check、$valid{或函数VUP$check、$valid{global$con;-两者都可以尝试。使用$result=mysqli_query$con,$query或diemysqli_error$con;而不是现在的版本。

我可以建议进行完整的代码更改吗?您应该将查询放在函数VUP中,并且不需要从数据库获取密码来检查它,您可以让mysql完成这项工作。如果需要,您只需要使用简单的引号您使用字符串进行测试。密码\u验证获取纯文本密码作为第一个参数,哈希密码作为第二个参数。好的,我可以将查询移动到VUP中,但如何在不从数据库获取密码的情况下进行验证?请查阅以下链接,并将其应用到您的代码中。同时确保该列足够长。MySQL将如果不是,则以静默方式发送。$2y$10$ZZCN7ULUKVY2SKB3ELVP.4Y3OC7NJTESFYQDSTQYX如果是这样,它的长度只有50,并且无效/太短。建议使用60 255,因此存储不正确。您需要增加列的长度,清空这些行,然后重新开始。RTM-因此,建议存储结果在一个可以扩展到60个字符以上的数据库列中,255个字符将是一个不错的选择。-想要作为答案吗?我想应该是这样。