【发布时间】:2014-11-20 20:41:38
【问题描述】:
更新 所以这是一个令人尴尬的愚蠢承认,但问题是我存储在数据库中的哈希是“密码”的哈希包括引号,我写的查询没有问题,问题出在椅子和键盘之间。
所以这是一个经常被问到的问题,我已经查看了整个 stackoverflow 和谷歌试图找出答案,但一直没有成功。
我有一个“代理”表,其中为每个代理分配了登录名和密码。密码字段是一个长度为 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 数据库中使用该本地创建的副本,它就会失败。
有什么想法吗?
【问题讨论】:
-
澄清一下,当我提供本地制作的 password_hash 副本时,password_verify 返回 true,但当我提供从 MySQL 表中提取的哈希时则不会。
-
所以
$testpw的测试工作正常吗?然后我只能想到将哈希保存到数据库中以某种方式出错。当您先保存$testpw,然后从数据库中选择该记录时会发生什么? -
@ircmaxell--password_verify 返回 false,据我所知,它应该返回 true。
-
@Ronald01990-- $testpw 有效,它使用 password_hash 函数保存“密码”的哈希值。我会看看我是否可以插入一个新的登录,然后立即测试它。
标签: php mysql mysqli password-hash php-password-hash