【问题标题】:password_verify does not work when using hashed password from database使用来自数据库的散列密码时,password_verify 不起作用
【发布时间】:2023-03-18 01:54:01
【问题描述】:

已解决

我的注册表有一个奇怪的问题。 JS 做了一些奇怪的事情,即使 password_verify 在登录时工作,哈希在某些情况下是不同的......现在我修复了我的代码,它现在可以工作了!谢谢大家!

已解决

我正在认真地想弄清楚为什么我的 password_verify 代码已经 4 天没有工作了,我真的很困惑和生气......

首先我必须说会话已经开始,其他一切都在正常工作。

但是当我尝试创建 password_verify 脚本时,它仍然回显错误...

数据库中的字段名为password,并设置为varchar 255

来自数据库的密码如下所示:

$2y$10$GEw0Ie6r/Udz2hgJVkCy.ut99NY5NE.h8LEvNM1gBizA1tY58iNa6

很好,应该是这个样子……

当我在我的页面上回显数据库密码时,它显示相同,所以很好。但是当我做password_verify 时,它不起作用。它显示password_verify 是假的......我不知道为什么,因为我100% 确定我在表单中输入的密码是正确的并且与db 密码匹配。但是,它不起作用,也没有像应有的那样回显“DONE”。

echo strlen 显示 60

echo $dbpassword 显示散列的数据库密码。

echo $passwordsubmitted 显示从表单正常输入的密码。

<?php 
if(isset($_POST['changepassword'])){
    if($_POST['username'] !== $_SESSION['username']){
        echo "Invalid username";
    }
    else{
        $stmtselectvalues = $mysqli->prepare("SELECT password FROM members WHERE username = ?");
        $stmtselectvalues->bind_param('s',$_SESSION['username']);
        $stmtselectvalues->execute();
        $stmtselectvalues->bind_result($dbpassword);
        $stmtselectvalues->store_result();
        while($stmtselectvalues->fetch()){
        $passwordsubmitted = $_POST['password'];
        echo strlen($dbpassword)."<p>";

        echo "Submitted password: ".$passwordsubmitted." and password from database: ".$dbpassword."<p>";
        if(password_verify($passwordsubmitted, $dbpassword) == false){
            echo "Invalid Password";
        }
        else{
            echo "DONE!";
            }
        }
    }
}
?>
<center>
    <form method='POST'>
        Username: <input type='text' name='username'><br>
        Password: <input type='text' name='password'><br>
        <input type='submit' name='changepassword'><br>
    </form>

但是,当我使用此代码时,它正在工作,并且 echo 为“DONE”,这意味着 password_verify 为 true...

<?php
if(isset($_POST['changepassword'])){
    if($_POST['username'] !== $_SESSION['username']){
        echo "Invalid username";
    }
    else{
        $dbpassword = password_hash("test", PASSWORD_BCRYPT);
        $passwordsubmitted = $_POST['password'];
        echo strlen($dbpassword)."<p>";

        echo "Submitted password: ".$passwordsubmitted." and password from database: ".$dbpassword."<p>";
        if(password_verify($passwordsubmitted, $dbpassword) == false){
            echo "Invalid Password";
        }
        else{
            echo "DONE!";
        }
    }
}
?>
<center>
    <form method='POST'>
        Username: <input type='text' name='username'><br>
        Password: <input type='text' name='password'><br>
        <input type='submit' name='changepassword'><br>
    </form>

我真的不知道为什么会这样。有什么建议吗?

更新 注册输入为&lt;input type='password' name='password'&gt;

注册时提交的密码使用此代码进行哈希处理:

$password = $_POST['password'];
$passwordhash = password_hash($password, PASSWORD_BCRYPT);

【问题讨论】:

  • 可以发一下函数password_verify吗?
  • @Populus - 功能?什么意思?
  • @Populus password_verify
  • @StevenTomko:该密码和种子的哈希值应该是“$2y$10$15trkRMpvZ2Fbm.0fZSwx.DjnbzDW5KPaNwiCUSMiPUGBwuuUM.t2”,你在数据库中的哈希值是错误的。
  • 这确认,问题出在注册表单上(您没有散列字符串“密码”)。如果我们能看到调用password_hash() 函数的代码会很有帮助。

标签: php mysqli php-password-hash


【解决方案1】:

问题似乎与散列有关。我已经用相同的字符串参数调用了bcrypt() 七次,它返回了七个不同的哈希值,只有前七个字符总是相同的 $2y$10$:

$2y$10$C7FReGma/9fauYdufdNR3uleGKBgcl4vzL/tMjsksKOmNoPpcoaT2
$2y$10$f7ZjFAgyq5tNcG7dc8RsIuOPTPLFyJFK0RiWfPusE7gqs4.hpRH.u
$2y$10$PnQrq.C3NOdxyNwpWZowzOe77Dsc0Qdr5yzrMzHAV3rH7aqVZYslG
$2y$10$6LL9imr9qB3mnJaoDFsurOAqas4Co/6bN.6mgheHzSboLDtT.Q5hS
$2y$10$Rytiq/6HILN3Bm6cLT7ZM.rO.LjxuLY2xM2FZs3Pa9O2BXbH5H3vO
$2y$10$gg21TJ6GiJg6Wz7RVQkyfufHzlAzfTkKfOdOgsRKotKpsgAoFQErK
$2y$10$v8YdEIA25mBIi4jsrCDABuFzmITv.BuMr9YQl2RUN2xc1rmk0Po9a

与 MD5() 相同的问题。所以,当password_verify() 比较两者时 散列它返回 false。

【讨论】:

  • 这就是它应该如何工作的。随机盐是必不可少的。不过,我不知道你怎么会遇到“与 MD5 相同的问题”。
猜你喜欢
  • 2016-05-22
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多