【发布时间】:2015-02-21 00:11:03
【问题描述】:
我正在使用带有向后兼容性脚本的 php 5.4:https://github.com/ircmaxell/password_compat/blob/master/lib/password.php
但这不重要,因为我可以在我的注册函数中进行散列和验证过程:
$hash = password_hash($pass, PASSWORD_DEFAULT);
echo $pass;
echo $hash;
if( password_verify($pass,$hash) )
echo 'success';
else echo 'failure';
//success is always shown
//EXAMPLE INPUT
$pass = 'password';
//EXAMPLE OUTPUT
password$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYSsuccess
但每当我尝试将哈希存储在 MySQL 数据库中,然后为验证函数检索它时,它总是失败。这是我的登录功能:
function user_login( $mysqli, $email, $pass ){
$err_msg = 'login: '.$mysqli->error.' | '.$email;
if( $stmt = $mysqli->prepare('SELECT password FROM users WHERE email=?') ) :
if( !$stmt->bind_param('s', $email) ) log_sql_error( $err_msg );
if( !$stmt->execute() ) log_sql_error( $err_msg );
if( !$stmt->bind_result( $hash ) ) log_sql_error( $err_msg );
if( $stmt->fetch() === FALSE ) log_sql_error( $err_msg );
if( !$stmt->close() ) log_sql_error( $err_msg );
//I can see that these values are identical to the ones
//echoed out in the registration function
echo $pass;
echo $hash;
if( password_verify($pass,$hash) )
echo 'success';
else echo 'failure';
else : log_sql_error( $err_msg );
endif;
}
//failure is always shown
//EXAMPLE INPUT
$pass = 'password';
//EXAMPLE OUTPUT
password$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYSfailure
我的“密码”列具有以下数据类型:VARCHAR(255) NOT NULL
没有出现 php 错误,所以我唯一能想到的是哈希值从数据库中出来时的格式与进入时的格式不同,但是当我回显这些值时,它们看起来是一样的。
我还能如何调试这个/我的代码有什么问题?
谢谢
更新:
这肯定和编码有关:
$hardcode_hash = '$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS';
echo $hash;
echo '<br/>';
echo $hardcode_hash;
echo '<br/>';
if( $hash == $hardcode_hash )
echo 'success';
else echo 'failure';
//OUTPUT
$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS
$2y$10$JK1jumvvSIm/gP3fWE3k9O98MzvHKDRYCjRPBniYg9riACyQw7WYS
failure
如何重新格式化 SQL 值以匹配 password_hash 的输出?这是我尝试过的:
(string)$hash
utf8_encode($hash)
如果我这样做:
$hash = settype($hash,"string");
if($hash == $hardcode_hash) 返回 true,但 password_verify($pass, $hash) 仍然返回 false
【问题讨论】:
-
谁在不发表评论或答案的情况下对问题投了反对票?没有帮助...
-
这些天大部分时间都是这样 :-)
-
您可以展示示例
$pass和$hash输出。没有人能够测试运行您的代码摘录。 -
使用
var_dump。如果字符串真的相同,则在第二种情况下不可能失败。 -
您是否检查了您的页面/数据库的编码,是否有可能一个变量包含多字节字符串,而另一个不包含?