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 项目脚本和数据库模式是否存在冲突的字符集定义。
我认为我的问题是环境问题,但我已尽我所能找到它。代码在 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 项目脚本和数据库模式是否存在冲突的字符集定义。