password_verify 不验证哈希

Posted

技术标签:

【中文标题】password_verify 不验证哈希【英文标题】:password_verify doesn't verify hash 【发布时间】:2014-12-30 13:22:36 【问题描述】:

我通过 password_hash 对插入的密码进行哈希处理。我使用 password_verify 验证它们。

但是,当我在我的数据库中插入一个散列密码并尝试验证它时,两个输出总是彼此不同。

我的页面如下,

main_login.php(表单):

<?php include 'header.php';?>
<body>
<form role="form" method="post" action="login.php">
  <div class="form-group">
    <label for="usrname">Username:</label>
    <input type="text" class="form-control" name="usrname" placeholder="Enter username">
  </div>
  <div class="form-group">
    <label for="passwrd">Password:</label>
  </div>
    <input type="password" class="form-control" name="passwrd" placeholder="Enter password">
    <br>
  <input type="checkbox">Remember Me
  <br>
  <br>
  <button type="submit" class="btn btn-default">Submit</button>
</form>
</body>
</html>

login.php(处理程序):

<?php
include 'vars.php';
include 'header.php';
$sql="SELECT * FROM members WHERE usrname='$usrname'";
$result=mysqli_query($con,$sql);
$count=mysqli_num_rows($result);
$row=mysqli_fetch_row($result);
$verify=password_verify($hash,$row[2]);
if($verify)
    $_SESSION["usrname"]=$usrname;
    echo "Correct";

else 
    echo "user: " . $usrname. "<br>";
    echo "pass: " . $hash. "<br>";
    echo "db: " . $row[2]."<br>";
    echo "Wrong Username or Password";

?>

vars.php:

<?php
$h='localhost';$u='caelin';$p='****';$d='ombouwnh';
$con=mysqli_connect($h,$u,$p,$d);
$usrname=$_POST['usrname'];
$passwrd=$_POST['passwrd'];
$hash=password_hash($passwrd, PASSWORD_DEFAULT);
?>

当我尝试使用用户名“caca”和密码“caca”登录时,每次重试时都会得到不同的输出。 我在 *** 上找不到这个特殊问题。

TIA

PS。如果您需要更多详细信息,请询问他们

【问题讨论】:

确保列的长度足以容纳散列;这通常是许多人犯的错误。 它是 varchar(255) @Fred-ii- 不是关于这个问题,但总的来说:是的,这是背后的巨大痛苦。 @Fred-ii- 我必须在用户实际登录之前启动会话吗?抱歉这个新问题 使用会话变量时需要;是的。你看过我对$row[1]的评论了吗? 【参考方案1】:

函数password_verify();有两个参数;一个非散列的输入和一个存储的散列来比较它。它自动对未散列的输入进行散列,以将其与存储的版本进行比较。因此,您的初始代码正在重新散列已经散列的密码。应该是这样的:

$verify=password_verify($_POST['passwrd'],$row[2]);

if($verify)
    $_SESSION["usrname"]=$usrname;
    echo "Correct";

else 
    echo "user: " . $usrname. "<br>";
    echo "pass: " . $hash. "<br>";
    echo "db: " . $row[2]."<br>";
    echo "Wrong Username or Password";

【讨论】:

去安德鲁。我很高兴 OP 得到了解决方案。在看到您的评论之前,我问过 OP 他/她是否希望我发布我自己使用的东西。最好使用 OP 的代码并找到实际问题的解决方案,而不是使用其他人的代码。 干杯 +1【参考方案2】:

您重新设置了密码 - 只需将明文密码和您的哈希(来自 db)传递给 password_verify 即可。

【讨论】:

20 分钟前已回答,已接受;谢谢。 抱歉,打开了问题并输入了回复,但在我的 wifi 连接修复之前无法发布(对于

以上是关于password_verify 不验证哈希的主要内容,如果未能解决你的问题,请参考以下文章

为啥 password_verify 返回 false?

PHP password_verify() 与 Python bcrypt.hashpw()

针对 Scrypt 组合哈希验证 python 密码:(设置+盐+哈希)

为啥 hash_equals 和 password_verify 不能正常工作?

php password_verify 不适用于数据库 [重复]

哈希传递PTH(pass the hash)