1

解决了

我的注册表有一个奇怪的问题。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 是真的......

<?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>

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

更新 注册输入是<input type='password' name='password'>

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

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

1 回答 1

-2

The issue seems to be with the hashing. I've called bcrypt() with the same string parameter seven times and it returned seven different hash values, only the first seven chars are always the same $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

The same issue with MD5(). So, when password_verify() compares the two hashes it returns false.

于 2015-05-01T08:30:44.510 回答