password_verify 写入数据库后不匹配

password_verify not matching after writing to database

我认为我的问题是环境问题,但我已尽我所能找到它。代码在 3 周前运行良好,几天前突然停止。我没有在那个时间范围内更新 O/S 或 PHP。

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

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

//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.
y$iw6fSApO7Ok0ySZ.OsQqbe.DpVrvzJ86ZYIsWYg5060hyXbBYEiee
y$iw6fSApO7Ok0ySZ.OsQqbe.DpVrvzJ86ZYIsWYg5060hyXbBYEiee
Match

在你的散列 $password var before INSERT 上使用 var_dump,然后在你的 $dbpwd after SELECT 看看你有没有弄错。此外,检查您的 PHP 项目脚本和数据库模式是否存在冲突的字符集定义。