Ошибка сравнения хэша с хешированным паролем MySQL (выходные значения равны) - PullRequest
3 голосов
/ 20 июля 2011

Я пытаюсь сравнить значение хешированного пароля в базе данных 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...

Пример вывода:

7816ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361 |7816ee6a140526f02289471d87a7c4f9602d55c38303a0ba62dcd747a1f50361

Есть мысли?

Ответы [ 5 ]

3 голосов
/ 13 октября 2012

У меня была точно такая же проблема. 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 голосов
/ 26 ноября 2011

Не уверен, что вы когда-нибудь решили эту проблему, но я потратил 30 минут на точно такую ​​же проблему. Оказывается, у моего значения mysql был дополнительный пробел в конце. Это был тестовый пользователь, которого я вручную добавил в базу данных и каким-то образом получил дополнительное место при копировании и вставке хешированного пароля.

Не уверен, относится ли это к вашей ситуации или нет, но я все равно поделился.

0 голосов
/ 20 июля 2011

Попробуйте переключиться! = На == и переключить контент.Как это

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

}

Я не уверен, почему это происходит, но вы можете быть уверены, что это сработает в моем случае

РЕДАКТИРОВАТЬ: вы сделали что-то не так в вашем случае. у меня работает

0 голосов
/ 20 июля 2011

== - это сравнение хеш-кода объекта, вам нужно использовать функцию strcmp для сравнения строковых литералов.

0 голосов
/ 20 июля 2011

Попробуйте использовать strcmp.Сравнение строк с == или! = Редко идет хорошо.

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

Вполне возможно, что по какой-то причине оно будет рассматриваться как число и не сможет сравниться.

...