Хобрук: Ваш путь к мастерству в программировании

password_hash каждый раз возвращает другое значение

Я создаю систему входа в систему и хочу хешировать пароли, чтобы сделать их более безопасными, но каждый раз она возвращает разные хэши и даже не может быть проверена с помощью password_verify(), вот мой код:

$password = password_hash($password4, PASSWORD_DEFAULT);

и вот мой код для проверки:

if(password_verify($password4, $dbpassword))

  • Вы не должны использовать password_hash() таким образом. 13.10.2015
  • @JohnConde Я избавился от функции md5, но не понимаю, почему она может ее исправить, в чем я прав, единственная причина, по которой она у меня есть, - сделать ее более безопасной. 13.10.2015
  • @JayBlanchard Как мне его использовать? 13.10.2015
  • @PeeHaa Чтобы взломать его, потребуется больше времени, если он несколько раз хэшируется с разными хэшами. 13.10.2015
  • Это утверждение неверно @ItzBenteThePig - дополнительное хеширование создает проблемы, а не решения. Подумайте о том, что вы пытаетесь защитить. password_hash() при правильном использовании предоставляет случайные соли и длинные хэши, для взлома которых потребуются сотни лет. 13.10.2015
  • @JayBlanchard О, я этого не заметил. 13.10.2015
  • @ItzBenteThePig вы читали документацию password_verify? А именно эта часть: Обратите внимание, что password_hash() возвращает алгоритм, стоимость и соль как часть возвращаемого хэша. Поэтому вся информация, необходимая для проверки хэша, включена в него. Это позволяет функции проверки проверять хэш без необходимости отдельного хранения соли или информации об алгоритме. Это должно прояснить, почему она не работает. 13.10.2015
  • @ Script47 Да, я это сделал, но мне это не помогает, может быть, я просто глупый или, может быть, я что-то упускаю. 13.10.2015
  • Еще одно примечание: Не ограничивайте пароли. Фразы-пароли — это ключ к более высокой безопасности. 13.10.2015
  • @JayBlanchard Для меня эти ссылки выглядят просто как руководство по созданию безопасного пароля, а не их хэшированию. 13.10.2015
  • Я вернулся к вашему первоначальному вопросу, так как из-за редактирования stealth кажется, что ваша функция не работает должным образом. Вызов дополнительной функции - это то, что привело вас в затруднительное положение, редактирование которого меняет характер вопроса. 13.10.2015
  • О хешировании заботится функция password_hash(). Что еще вам нужно знать @ItzBenteThePig? Документы предоставляют различные методологии хеширования, если вы хотите их использовать. 13.10.2015
  • @JayBlanchard Если у меня все еще есть та же проблема, я предполагаю, что ее причиной была не она, и поэтому я не думаю, что это меняет характер вопроса, это просто меняет внешний вид вопроса. 13.10.2015
  • Ах, и я только что откатил ваш, потому что в нем не было исходного кода @PeeHaa! РЖУ НЕ МОГУ. Нам нужно объединить исходный код с запрошенными вами обновлениями. 13.10.2015
  • @ItzBenteThePig, если вы в точности следовали тому, как хэшировать, а затем проверить пароль, то есть A.) ошибка, о которой мы не знаем, или 2.) какой-то другой код, который может мешать. 13.10.2015

Ответы:


1

Итак, давайте возьмем это по одной части за раз

но он каждый раз возвращает другой хэш

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

Нет необходимости MD5 или делать какое-либо другое хэширование. Если вы хотите повысить безопасность password_hash, вы проходите более высокую стоимость (стоимость по умолчанию равна 10).

$password = password_hash($password4, PASSWORD_DEFAULT, ['cost' => 15]);

Как проверить

if(password_verify($password4, $dbpassword))

Таким образом, $password4 должен быть вашим нехешированным паролем, а $dbpassword должен быть хешем, который вы сохранили в своей базе данных.

13.10.2015
Новые материалы

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

Обзор 20 основных и современных методов работы с массивами в JavaScript
Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

Да, но я чувствую необходимость указать, что это или не единственные два.
Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.