UPDATE所以这是一个令人尴尬的愚蠢承认,但问题是我存储在数据库中的哈希值是“密码”的哈希值包括引号,我写的查询没有问题,问题出在椅子和键盘之间。
所以这是一个经常被问到的问题,我查遍了 stackoverflow 和 google 试图找到答案,但到目前为止都没有成功。
我有一个“代理”表,其中包含分配给每个代理的登录名和密码。密码字段是长度为 255 的 varchar。
这是我的 php 代码:
$conn = new mysqli( "localhost", "VABEN", "**********", "VABen" );
if( $conn->connect_error )
{
die( "Connection failed!" . $conn->connect_error );
}
$username = $_POST["username"];
$password = $_POST["password"];
$s = $conn->prepare( "SELECT `agent_password` FROM `VABen`.`agents` WHERE `agent_login`=?" );
$s->bind_param( "s", $username );
$s->execute();
$hash = $s->get_result();
$hash = $hash->fetch_array( MYSQLI_ASSOC );
$testpw = password_hash( 'password', PASSWORD_DEFAULT );
echo "Comparing submitted password to locally created hash $testpw which has a length of " . strlen($testpw) . "<br>";
if( password_verify( $password, $testpw ) )
{
echo "Password '$password' matches with hash $testpw<br>";
}
else
{
echo "Password '$password' does not match with hash $testpw<br>";
}
echo "<br>";
echo "Supplied Password: '$password'<br>";
echo "Queried Hash: " . $hash['agent_password'] . " which has a length of " . strlen( $hash['agent_password'] ) . "<br>";
echo "Result of password_verify: ";
if( password_verify( $password, $hash['agent_password'] ) )
echo "true<br>";
else
echo "false<br>";
我很茫然。它似乎只在我提供本地创建的password_hash 副本时才起作用,如果我随后在MySQL 数据库中使用该本地创建的副本,则会失败。
有任何想法吗?
存储哈希值
你检查过了吗agent_password
正在存储由以下方式生成的哈希值:
password_hash( $password, PASSWORD_DEFAULT );
检查 PDO 标准
可能没有效果,但值得遵循不同实现的标准bindParam
。如果您正在使用?
方法,那么:
$s->bind_param( 1, $username );
您的脚本中有几个奇怪的 PDO 实现,请尝试调整:
$s->execute();
//$hash = $s->get_result();
//$hash = $hash->fetch_array( MYSQLI_ASSOC );
$hash = $s->fetchColumn();
更改后续调用$hash['agent_password']
只是$hash
反而。
测试基本操作
测试以下内容:
// $password = $_POST["password"];
$password = "password";
然后,还尝试存储该哈希值,并在最终验证步骤之前从 mysql 再次检索它。
Finally
我深深怀疑存储的内容agent_password
实际上不是一个经过哈希处理的密码password_hash
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)