@0ldn0mad

Искажается хеш из MySQL при проверке пароля — как поправить?

При регистрации пароль хешируется и отправляется в базу. В базе хэши хранятся в поле VARCHAR - длиной 128, кодировка базы - utf8_general_ci.
При проверке пароля достаю из базы хэш и проверяю его с введённым паролем - password_verify
Вот скрипт проверки пароля:
$loadData = mysqli_query($conn, "SELECT * FROM reg WHERE email = '$formEmail'");
		$userData = mysqli_fetch_array($loadData);
		$passwd = trim($_POST['password']);
		$checkPasswd = password_verify($passwd, $userData["password"]);
		if ($checkPasswd == true){
			echo "Пароль верный!";
		}else{
			echo "Пароль НЕ ВЕРНЫЙ!!";
		}


Проверял тупо в сторонке:

$passwd = '123123';
$twoHash = '$2y$05$y9vdifo939stS5ybW5ZGceDBiQWH4sYvUfZtCukOidXszIyUL.SGy';
$check = password_verify($passwd, $twoHash);
var_dump(password_verify($passwd, '$2y$05$y9vdifo939stS5ybW5ZGceDBiQWH4sYvUfZtCukOidXszIyUL.SGy'));
var_dump(password_verify($passwd, password_hash($passwd, PASSWORD_DEFAULT, ['cost' => 5])));
if ($check == true){
	echo "Пароль верный!";
}else{
	echo "Пароль НЕ ВЕРНЫЙ!!";
}


Первый вардамп не проходит, во втором (где сам генерит и сам проверят ) - все нормально.
В переменную $twoHash хеш копипастил несколько раз - ошибиться не мог.
Делаю вывод, что хэш искажает или сама база MySQL или mysqli_fetch_array. Может, ошибаюсь.
Подскажите как решить проблему?
  • Вопрос задан
  • 363 просмотра
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Показываю на пальцах, как отлаживать свой кривой код

$passwd = '123123';
$email = "test@test.test";
$hash = password_hash($passwd, PASSWORD_DEFAULT);
$stmt =$conn->prepare("INSERT INTO reg SET email = ?, password=?, name_reg=''");
$stmt->bind_param("ss", $email, $hash,);
$stmt->execute();
$id = $conn->insert_id;

$stmt =$conn->prepare("SELECT * FROM reg WHERE id=?");
$stmt->bind_param("s", $id);
$stmt->execute();
$result = $stmt->get_result();
$userData = $result->fetch_assoc();

$checkPasswd = password_verify($hash, $userData["password"]);
var_dump($hash, $userData["password"],$passwd === $userData["password"],$checkPasswd);


Запустить этот код и убедиться, что на удивление, База данных ничего с твоими данными не делает, возвращает в точности то же самое что клал (ну или, как вариант, с удивлением обнаружить что длина поля совсем не 128 букв например).

После этого начать разбираться с менее фантастическими вариантами. Например, что в БД "после экспериментов" лежит куча записей с оинаковыми емейлами и разными паролями. Или какая-то другая проблема столь же интеллектуального свойства.

Если $hash, $userData["password"] выглядят одинаково, но $passwd === $userData["password"] возвращает false, то выводим $hash, $userData["password"] через urlencode() и смотрим разницу.

Основная идея тут в том, чтобы проверять каждое свое предположение. Причем не методом высасывания из пальца, а самым что ни на есть наглядным способом. То есть проверять ровно то, что клал в конкретную таблицу БД, а не то что когда-то давно куда-то клал, но куда и когда не помню.
Ответ написан
@immelnikoff
Изучаю БД
В базе хеши хранятся в поле VARCHAR - длинной 128, кодировка базы - utf8_general_ci

Я, конечно, извиняюсь, но кто придумал хранить хэш-суммы в поле типа VARCHAR?
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Первый вардамп не проходит, во втором (где сам генерит и сам проверят ) - все нормально.
Соль?

Что мешает вывести во втором варианте дамп полученного хеша и посмотреть чем отличается от того что лежит в мускуле?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы