php密码\u verify()哈希和pass不匹配
我用password\u hash将我的密码存储在我的数据库中,并尝试在登录时用password\u verify验证密码。由于某些原因,密码验证一直返回false 我阅读了关于这个函数的文档,它说要确保函数中使用的散列在单引号之间,否则由于$的原因,它会像读取三个变量一样读取散列,所以我尝试像这样编写$valid“$valid”。但那没用 当我回显$valid时,输出为$2y$10$zzZCN7UlukvY2skb3ELVp.4y3Oc7NJTEsFyqdstqYxT 当我echo$check时,输出是123,这是用于创建帐户的密码 这是我login.php的一部分,这就是我觉得问题所在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
$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个字符将是一个不错的选择。-想要作为答案吗?我想应该是这样。