写入数据库后,Password_verify不匹配


password_verify not matching after writing to database

我认为我的问题是环境,但我已经动用了我能想到的一切来找到它。代码在3周前还工作得很好,几天前突然停止了。在这段时间内我还没有更新O/S或PHP。

我使用password_hash从$_POST变量创建密码,然后将其写入MySQL数据库字段(设置为varchar(255))。问题出现后,我添加了测试代码,在写入数据库之前对内存中的变量进行password_verify,然后在将其写入数据库后从数据库中重新读取值。在这两种情况下,它都作为匹配返回。但是,任何其他试图运行password_verify的页面都会返回不匹配的结果。我已经捕获了初始哈希值,并将其与数据库中的值进行了直观的比较,它们是相同的。两个服务器(生成哈希值的服务器和在用户登录时读取哈希值的服务器)都运行相同的php版本(5.6.9-0+deb8u1)。

这是我在当前调试状态下的完整代码。在下面的代码中,使用PASSWORD_DEFAULT注释掉的行是我最初使用的。我尝试了BCRYPT选项,看看它是否会修复它。我还尝试将$_POST['password']放入一个变量中,而不是直接调用它,并在它周围包装一个装饰。一切似乎都很好,直到我离开这一页,从另一页尝试。我也查看了网上其他帖子中讨论的内容。

//USER DOES NOT EXIST 
mysqli_close($con);
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    $error = true;
}
// New user - add them to database
echo "Creating your account. <br>";
$pwd = $_POST['password'];
//$password = password_hash(trim($_POST['password']), PASSWORD_DEFAULT);    
$password = password_hash($pwd, PASSWORD_BCRYPT);   
echo $password . '<br>';

$sel = 'CALL sp_add_user("'. $_POST['firstname'] . '","'. $_POST['lastname'] . '","'. $_POST['email1'] . 
    '","'. $_POST['city'] . '","'. $_POST['country'] . '","'. $password . '","'. $timestamp . '")';
$con=mysqli_connect($conip,$dbuser,$dbpw,$mgrdb);
if(!mysqli_query($con, $sel))
{
    echo("Error description: " . mysqli_error($con));
}
else{
    mysqli_close($con);
    //verify the password in the DB is good
    $sel='CALL sp_get_pwd("' . $_POST['email1'] . '")';
    //echo $sel;
    $con=mysqli_connect($conip,$dbuser,$dbpw,$mgrdb);
    $result = mysqli_query($con, $sel);
    if (mysqli_num_rows($result)>0){
        while($row = mysqli_fetch_array($result)) {
            $dbpwd = $row['password'];
        }
    }
    echo $dbpwd . '<br>';
    if(password_verify(trim($_POST['password']), $dbpwd)){echo 'Match<br>'; } else { echo 'Match failed<br> ';} 
    mysqli_close($con);

我模拟了没有数据库和表单抓取的代码,它运行正常。这意味着你的数据库或你的POST字段有问题。

// New user - add them to database
echo "Creating your account. <br>";
$pwd = '12345';
//$password = password_hash(trim($_POST['password']), PASSWORD_DEFAULT);    
$password = password_hash($pwd, PASSWORD_BCRYPT);   
echo $password . '<br>';
$dbpwd = $password;
echo $dbpwd . '<br>';
if(password_verify(trim($pwd), $dbpwd))
{
    echo 'Match<br>';
}
else
{
    echo 'Match failed<br> ';
}
输出:

Creating your account.
$2y$10$iw6fSApO7Ok0ySZ.OsQqbe.DpVrvzJ86ZYIsWYg5060hyXbBYEiee
$2y$10$iw6fSApO7Ok0ySZ.OsQqbe.DpVrvzJ86ZYIsWYg5060hyXbBYEiee
Match

在 INSERT之前使用var_dump对哈希$password var ,然后在 SELECT之后再次使用$dbpwd ,看看是否有任何错误。此外,检查PHP项目脚本和数据库模式是否存在字符集定义冲突。