比较哈希值和已哈希的MySQL密码时出错(输出值相等)

3

我试图比较MySQL数据库中的哈希密码值和登录表单中输入密码的哈希值。

然而,当我比较这两个值时,它显示它们不相等。我先去掉了盐(salt)以简化操作,测试了输出结果,得到了相同的值。

$password1 = $_POST['password'];
$hash = hash('sha256', $password1);
...connect to database, etc...
$query = "SELECT *
    FROM users
    WHERE username = '$username1'";
$result = mysql_query($query);
$userData = mysql_fetch_array($result);
if($hash != $userData['password']) //incorrect password
{
    echo $hash."|".$userData['password'];
   die();
}
...other code...

示例输出:

7816ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361| 7816ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361

有什么想法吗?


你遇到了一个奇怪的问题。var_dump($hash)var_dump($userData['password'])的输出是什么? - Viktor
5个回答

3

我遇到了完全相同的问题。 var_dump() 告诉我有两个具有相同属性 string(128) 的变量。唯一能让比较工作的方法是将哈希值强制转换为字符串:

$password1 = $_POST['password'];
$hash = (string)hash('sha256', $password1);
...
$userData = (string)mysql_fetch_array($result);

if($hash == $userData) {
  //This should return true.
}

0

尝试使用strcmp。使用==或!=进行字符串比较很少成功。

if(strcmp($hash, $userData['password']) != 0) {
    //this would be where the password was incorrect.
}

可能是由于某种原因将其视为数字并未能通过比较。


这可能是一个奇怪的、最后的努力,但请尝试将 mysql_fetch_array($result); 替换为 mysql_fetch_array($result, MYSQL_ASSOC);。这真的不应该是你的麻烦之源,但 PHP 是一个很多奇怪的东西。 - CassOnMars
也不起作用。我不明白,因为每次测试时输出都显示完全相同的值。 - Charlie

0

尝试将 != 改为 == 并交换内容。像这样

if($hash == $userData['password']) //incorrect password
{
    //proc login...
}
else
{
    echo $hash."|".$userData['password'];
   die();

}

我不确定为什么会发生这种情况,但你可以确定在我的情况下它会起作用。

编辑:在你的情况下你做错了些什么。对我有效


我想不出还可能是什么。当我输出这两个值时,它们是相同的,尝试改变顺序。 - Charlie
我不确定为什么会发生这种情况。你试过我的第一段代码吗? - genesis
我在一个单独的文件中尝试了你的代码,它可以运行。然后我用我的哈希值在我的登录脚本上做了完全相同的操作,但它没有工作。 - Charlie

0

== 是一个对象哈希码比较,你需要使用 strcmp 函数来比较字符串字面值。


即使使用了if(strcmp($hash, $userData['password']) == 0)也无法正常工作。 - Charlie

0

不确定您是否解决了这个问题,但我刚刚花了30分钟来解决完全相同的问题。结果发现我的mysql值末尾有一个额外的空格。那是一个测试用户,我手动添加到数据库中,某种方式在复制和粘贴散列密码时得到了一个额外的空格。

不确定这是否适用于您的情况,但我想分享一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接