@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. Может, ошибаюсь.
Подскажите как решить проблему?
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 3
@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
Первый вардамп не проходит, во втором (где сам генерит и сам проверят ) - все нормально.
Соль?

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

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

Войти через центр авторизации
Похожие вопросы
SaveTime Москва
от 160 000 руб.
SaveTime Москва
от 100 000 руб.
Tilda Publishing Москва
от 140 000 до 180 000 руб.