比较散列和散列mysql密码时出错(输出值相等)


Error comparing hash to hashed mysql password (output values are equal)

我试图比较mysql数据库中的散列密码值与从登录表单输入的密码的散列值。

然而,当我比较这两个值时,它说它们不相等。我去掉了盐,然后测试了输出结果,得到了相同的值

$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...
样本输出:

7816 ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361 | 7816年ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361

任何想法吗?

我也有同样的问题。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.
}

尝试使用strcmp。使用==或!=进行字符串比较的效果很少。

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

由于某些原因,它很可能将其视为数字而无法进行比较。

尝试切换!=到==并切换内容。这样的

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

我不知道为什么会这样,但你可以肯定它会在我的情况下工作

编辑:你做错了什么。

==是对象哈希码比较,需要使用STRCMP函数来比较字符串字面值

不确定你是否已经解决了这个问题,但我刚刚浪费了30分钟的时间来解决同样的问题。原来我的mysql值在末尾有一个额外的空间。这是一个我手动添加到数据库的测试用户,在复制和粘贴散列密码时不知何故获得了额外的空间。

不确定这是否适用于你的情况,但我想无论如何我都要分享。