password verify php не работает
mysql — php password_verify не работает с базой данных
это не должно иметь значения, потому что я могу заставить процесс хеширования и проверки работать в моей функции регистрации:
но всякий раз, когда я пытаюсь сохранить хеш в базе данных MySQL, а затем извлечь его для функции проверки, он всегда завершается неудачей. Вот моя функция входа в систему:
Мой столбец «пароль» имеет этот тип данных: VARCHAR(255) NOT NULL
Ошибки php не отображаются, поэтому единственное, о чем я могу думать, это то, что значение хеш-функции не форматируется таким же образом, когда оно выходит из базы данных, когда оно входит, но когда я выводю значения, они выглядят как идентичны.
Как еще можно отладить это / что не так с моим кодом?
Это определенно связано с кодировкой:
Как мне переформатировать значение SQL, чтобы соответствовать выводу password_hash? Вот что я попробовал:
Решение
Нашел проблему. когда я сделал это:
он напечатал 90, что странно, потому что в конце, когда я распечатывал сообщение об успехе / неудаче, точно не было пробелов, а поле имеет длину varchar 255
Я добавил эту строку:
И теперь работает нормально.
Странно, что никто больше не сталкивался с этой проблемой. Есть похожие сообщения о password_verify, но ни один из них не требовал такого типа преобразования или какого-либо преобразования в этом отношении:
Одна вещь, которая беспокоит меня, — это предотвращение прямой совместимости кода. Как я узнаю, что при изменении значения по умолчанию хеш имеет длину 60 символов?
Другие решения
Просто для дальнейшего использования. У меня была та же самая проблема с паролями, терпящими неудачу без причины. Когда я присмотрелся к нему, я увидел, что поле пароля в базе данных было недостаточно большим, чтобы хранить полный хэш, поэтому некоторые символы были обрезаны. После увеличения размера поля базы данных все заработало отлично.
У меня была та же проблема, что и у вас, когда она не работала, по какой-то причине она, кажется, помогает поставить:
в код, хотя моя строка была уже 60 символов.
У меня была та же проблема, и она все еще не работала, несмотря на то, что мои столбцы базы данных были varchar (255), что хэши были 60 символами, и что все мои кодировки были UTF-8. Я довольно новичок в PHP и SQL, поэтому я не буду притворяться, что точно понимаю, почему это работает, но мне удалось это исправить, поэтому я надеюсь, что этот пост поможет другим людям с такой же проблемой.
Оказалось, что основной причиной, по которой password_verify () не проверял мои хэши, было то, что я сделал подготовленный оператор, который использовал хранимую процедуру ранее в скрипте, не извлекая все результаты из запроса, чтобы очистить буфер перед закрытием и повторное открытие соединения для выполнения следующего запроса. Вызов next_result () для mysqli_link после закрытия оператора гарантирует, что все результаты будут использованы.
Кроме того, я использовал другой подготовленный оператор с хранимой процедурой для вставки пароля, но мне все еще нужно было вызывать store_result () и free_result (), даже если наборы результатов не возвращались из вставки. Я предполагаю, что сочетание этих вещей повредило мои данные где-то вдоль линии, в результате чего password_verify () возвращал false на казалось бы идентичных хешах.
Этот ответ было для другой проблемы, но я нашел это полезным для изучения, как правильно закрыть подготовленные операторы с помощью хранимых процедур.
Не работает password_verify
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Функция password_verify
Нужно в данный код создать функцию password_verify для проверки кеша, не пойму куда ее вставлять то.
Принцип работы password_verify()
Добрый день, уважаемые форумчане! Прошу помощи в связи с недопониманием алгоритма работы функции.
В password_verify нужно передать пароль пользователя и хеш из БД:
Gregory_N, это всё я понимаю. Но вы не совсем понимаете что происходит на страницы авторизации. Авторизация и регистрация это два отдельных скрипта. Соответственно и обработка данных должна отличаться.
В вашем коде (для авторизации), это:
Решение
Можете, пожалуйста, пояснить в чём разница между моей версией кода и той что вы скинули.
Добавлено через 2 минуты
Как конкретно работает этот участок кода:
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Проверка с использованием password_verify
Делал я авторизацию и возникла необходимость проверить захэшированный пароль, лежащий в текстовом.
Password_verify Как дешифровать в реальном проекте
Всем доброго времени суток! У меня такая проблема уже несколько дней не могу решить, как в реальном.
Password_verify возвращает false, хотя данные корректны
Здравствуйте, при использовании password_verify получаю false, параметры при этом передаю верные.
Приложение работает в Debug, странно работает в Release и не работает при билде
Действия выполняются на эмуляторе Pixel 2. Android 9.0. Если я запускаю приложение с конфигурацией.
password_verify не правильно работает
пишу логин где нет с БД. пишет no akk (логин нет на БД) пишу логин и не правильно пароль где на БД. пишет pass no (пароль не правильно) пишу логин и правильно пароль. опять пишет pass no (пароль не правильно)
object(RedBeanPHP\OODBBean)#15 (10) < ["properties":protected]=>array(5) < ["id"]=>string(2) «20» [«login»]=> string(5) «root1» [«password»]=> string(30) «$2y$10$6F****************» [«pin»]=> string(4) «1234» [«email»]=> string(3) «123» > [«__info»:protected]=> array(5) < ["type"]=>string(5) «users» [«sys.id»]=> string(2) «id» [«sys.orig»]=> array(5) < ["id"]=>string(2) «20» [«login»]=> string(5) «root1» [«password»]=> string(30) «$2y$10$6***************» [«email»]=> string(3) «123» > [«tainted»]=> bool(false) [«changed»]=> bool(false) > [«beanHelper»:protected]=> object(RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper)#11 (0) < >[«fetchType»:protected]=> NULL [«withSql»:protected]=> string(0) «» [«withParams»:protected]=> array(0) < >[«aliasName»:protected]=> NULL [«via»:protected]=> NULL [«noLoad»:protected]=> bool(false) [«all»:protected]=> bool(false) >
2 ответа 2
Исходя из этой информации
предположу, что длина поля password в таблице пользователей составляет 30 символов.
Этого недостаточно для хранения хеша получаемого от функции password_hash():
Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).
Следует увеличить длину поля для хранения хеша до 255 символов и перегенерировать пароли всех пользователей с помощью функции password_hash().
Хэширование паролей в PHP 5.5 с использованием нового API
Использование BCrypt является общепринятым и лучшим способом для хэширования паролей, но большое количество разработчиков по-прежнему используют старые и слабые алгоритмы, вроде MD5 и SHA1. Некоторые разработчики даже не используют соль для хэширования. Новый API хэширования в PHP 5.5 ставит своей целью привлечь внимание к BCrypt, упрощая работу с ним. В этой статье я расскажу об основах использования нового API для хеширования в PHP.
password_hash()
Хотя функция crypt() довольно безопасна, она, по мнению многих, слишком сложная. Некоторые разработчики, чтобы не возиться с ней, используют слабую соль и слабый алгоритм для генерирования хэша, например:
Но функция password_hash() позволяет упростить нашу жизнь и обезопасить наш код. Когда вам нужно получить хэш пароля, просто скормите его в эту функцию, и она вернет хэш, который можно хранить в базе данных.
Вот и все! Первым параметром является строка пароля, который необходимо захэшировать, а второй параметр определяет алгоритм, который должен быть использован для генерирования хэша.
Алгоритм по умолчанию, в настоящее время, BCrypt, но более сильный алгоритм может быть установлен по умолчанию, когда-нибудь в будущем, и, возможно, он будет генерировать большие строки. Если вы используете PASSWORD_DEFAULT в ваших проектах, обязательно храните хэш в колонке, размером больше 60 символов. Установка размера колонки до 255 может быть хорошим выбором. Вы также можете использовать PASSWORD_BCRYPT в качестве второго параметра. В этом случае результат всегда будет 60 символов.
Главное здесь в том, что вам не нужно заботиться о значении соли и стоимости вычисления хэша. Новый API будет делать это за вас. И соль является частью хэша, так что вам не придется хранить его отдельно. Если вы хотите использовать вашу собственную соль (или стоимость вычисления), вы можете сделать это путем передачи третьего аргумента функции:
Таким образом, Вы будете всегда идти в ногу с актуальными мерами безопасности. Если PHP позже примет решение о применении более мощного алгоритма хеширования, ваш код может воспользоваться им без изменений.
password_verify()
Теперь, когда вы видели, как генерировать хэши с новым API, давайте посмотрим, как проверить пароль. Мы просто берем хэш из базы, и пароль, введенный пользователем и передаем их в эту функцию. password_verify() возвращает true, если хэш соответствует указанному паролю.
Соль является частью хэша и именно поэтому нам не придется возиться с ней отдельно.
password_needs_rehash()
Что делать, если вам нужно изменить соль или стоимость вычисления для сохраненных паролей? Например, вы решили усилить безопасность и увеличить стоимость вычисления или изменить соль. Или PHP изменил алгоритм хэширования, используемый по умолчанию. В этих случаях вы хотели бы изменить существующие хэши паролей. Функция password_needs_rehash() проверяет, использует ли хэш пароля конкретный алгоритм, соль и стоимость вычисления.
Имейте в виду, что вам нужно сделать это, когда пользователь авторизуется на сайте, так как это единственный раз, когда у вас есть доступ к его незашифрованному паролю.
password_get_info()
Заключение
Новый API хэширования паролей, безусловно, удобнее, чем возня с crypt(). Если ваш сайт в настоящее время работает на PHP 5.5, то я настоятельно рекомендуется использовать новое API хэширования. Те, кто используют PHP 5.3.7 (или более новой версии), могут использовать библиотеку под названием password_compat которая эмулирует это API и автоматически отключает себя при использовании PHP версии 5.5+.
php password_verify не работает с базой данных
Я использую php 5.4 с этим обратным скриптом совместимости: https://github.com/ircmaxell/password_compat/blob/master/lib/password.php
это не имеет значения, потому что я могу заставить процесс хеширования и проверки работать в моей функции регистрации:
но всякий раз, когда я пытаюсь сохранить хэш в базе данных MySQL, а затем извлекаю его для функции проверки, он всегда терпит неудачу. Вот моя функция входа:
В моем столбце «password» указан этот тип данных: VARCHAR(255) NOT NULL
Нет ошибок php, поэтому единственное, что я могу придумать, это то, что хеш-значение не отформатировано таким же образом, когда оно выходит из базы данных, когда оно вошло, но когда я повторяю значения, они кажутся идентичны.
Как еще я могу отладить это / что не так с моим кодом?
Это определенно имеет отношение к кодировке:
как мне переформатировать значение SQL, чтобы он соответствовал выходу password_hash? Вот что я пробовал:
Нашел проблему. когда я это сделал:
он напечатал 90, что странно, потому что в конце концов не было пробелов, когда я распечатывал сообщение об успехе / неудаче, и поле имеет длину varchar 255
Я добавил эту строку:
И теперь это прекрасно работает.
Странно, что никто больше не сталкивался с этой проблемой. Есть похожие сообщения о password_verify, но ни один из них не требовал такого преобразования или любого преобразования в этом отношении:
php password_verify не работает
password_verify php не соответствует
Использование функции password_hash и password_verify PHP 5.5
Меня беспокоит одно: это предотвращает переключение кода. Как я узнаю, что хэш составляет 60 символов при изменении по умолчанию?
Только для справок в будущем. У меня была такая же проблема, что и пароли без причины. Когда я внимательно посмотрел на него, я увидел, что поле пароля в базе данных было недостаточно большим для хранения полного хеша, поэтому некоторые символы были отключены. После увеличения размера поля базы данных он работал отлично.
У меня была та же проблема, с которой вы работали, по какой-то причине, похоже, это помогает:
в код, хотя моя строка уже имела длину 60 символов.