password_verify() не работает в php

Я создал пароль, используя password_hash, например:

$password = password_hash('password123', PASSWORD_DEFAULT);

Это хранится в базе данных MySQL в столбце с varchar (60).

В моей форме входа я использую:

if(password_verify($password, $foundUser->Password){ /*login*/ }

где $password — это ввод открытого текста из формы входа, а $foundUser->Password — это хеш, который хранится в базе данных, но функция password_verify() всегда возвращает false.

Я проверил свои входы, используя следующий код:

echo "Password: {$password} <br>"; echo "Found password: ".$foundUser->Password."<br>";

который выводит:

Password: password123 Found password: $2y$10$8.ICQHCyCPzS.xygPO4cfuHsHZb6Kuxynn8/uUHOU1.7gY.UhSIXa

поэтому я достаточно уверен, что ввожу правильный пароль и получаю правильный хэш из своей базы данных.

Я просмотрел ссылки в этот вопрос для ответов, но не т заставил это работать еще. У кого-нибудь есть идеи, почему password_verify() возвращает false?


person dylanrholloway    schedule 01.02.2017    source источник
comment
Из руководства: рекомендуется хранить результат в столбце базы данных, который может превышать 60 символов (хорошим выбором будет 255 символов).   -  person Álvaro González    schedule 01.02.2017
comment
Обратите внимание, что PASSWORD_DEFAULT предназначен для изменения с течением времени по мере добавления в PHP новых и более надежных алгоритмов. По этой причине длина результата использования этого идентификатора может меняться со временем. Поэтому рекомендуется хранить результат в столбце базы данных, который может превышать 60 символов (255 символов было бы хорошим выбором). – Просто для начала… Вы проверили, что значение, полученное из вашей базы данных, точно такой же, как у password_hash…?   -  person deceze♦    schedule 01.02.2017
comment
... в настоящее время, хотя PASSWORD_DEFAULT использует BCrypt, не так ли, поэтому он должен всегда быть строкой из 60 символов.   -  person CD001    schedule 01.02.2017
comment
@Alvaro Gonzalez и @deceze Я только что проверил это, сгенерировав новый хэш с помощью password_hash() и скопировав его прямо в базу данных в виде открытого текста. Когда я повторяю это, он печатает точно такой же код, который сгенерировал password_hash().   -  person dylanrholloway    schedule 01.02.2017
comment
Протестировал его на своем сервере с вашим вводом password_verify('password123', '$2y$10$8.ICQHCyCPzS.xygPO4cfuHsHZb6Kuxynn8/uUHOU1.7gY.UhSIXa') => он вернул true. Так что ваш код кажется в порядке. Какую версию PHP вы используете для проверки пароля?   -  person martinstoeckli    schedule 01.02.2017
comment
@martinstoeckli Я использую версию 5.6.28.   -  person dylanrholloway    schedule 01.02.2017
comment
Странный способ проверить длину хеша... Что печатает var_dump($password)? Вы настроили MySQL для отклонения усечения данных?   -  person Álvaro González    schedule 01.02.2017
comment
Как вы проверяете возвращаемое значение, у вас есть отладчик? Возможно ли, что проблема кроется внутри оператора if, может быть, вы перенаправляете без выхода?   -  person martinstoeckli    schedule 01.02.2017
comment
@AlvaroGonzález var_dump($password) выводит string(11) "password123"   -  person dylanrholloway    schedule 01.02.2017
comment
В показанном вами небольшом коде есть синтаксическая ошибка, поэтому вы наверняка многое убрали ... Я предполагаю, что проблема в тех частях, которые вы не показали.   -  person Narf    schedule 01.02.2017
comment
Какая? $password = password_hash('password123', PASSWORD_DEFAULT); создает нехешированную строку из 11 символов?   -  person Álvaro González    schedule 01.02.2017


Ответы (3)


установить значение столбца базы данных больше 60, поскольку зашифрованных символов пароля может быть больше 100. И $password = password_hash('password123', PASSWORD_DEFAULT); эта функция возвращает зашифрованный пароль, который может меняться каждый раз.

person Priya Dharsini    schedule 01.02.2017

В руководстве по php для функции password_hash() есть предупреждение: использование PASSWORD_BCRYPT в качестве алгоритма приведет к усечению параметра пароля до максимальной длины 72 символов. прочтите этот http://php.net/manual/en/function.password-hash.php

возможно, вам нужно изменить этот столбец mysql с varchar (60) на varchar (73) или больше. вы также можете использовать тип текста.

person M. K Hossain    schedule 01.02.2017
comment
Функция password_hash() сократит пароль до 72 символов, но будет работать без проблем. Хэш по-прежнему будет состоять из 60 символов для хеша BCrypt ('$2y$10$...). - person martinstoeckli; 01.02.2017

Решил свою проблему ребята. В соответствии с предложениями @martinstoeckli и @Narf я изменил способ его отладки и обнаружил, что проблема была не в password_verify(), а в том, как я обрабатывал вывод. Извините за беготню и спасибо за вашу помощь.

person dylanrholloway    schedule 01.02.2017