Рейтинг:1

Как функция password_verify() получает соль из пароля, хранящегося в БД?

флаг sg

Я создаю простую форму регистрации и входа с использованием PHP. При регистрации я создаю хэш с помощью функции password_hash(), а затем сохраняю его в БД. Во время входа сначала я создал новый хеш, используя функцию password_hash(), а затем сравнил его с сохраненным хэшем пароля.

Это все время не удавалось, потому что, как я теперь понимаю, новая соль используется каждый раз, когда вы создаете хэш пароля с помощью функции password_hash(). После исследования я узнал, что нужно использовать PHP-функцию password_verify(<plain_text_password>,<password_fetched_from_DB>).

Чего я не понимаю, так это того, как функция password_verify знает значение соли, которое использовалось ранее во время регистрации? Если соль неизвестна, тогда password_verify также должен завершиться ошибкой, как функция password_hash, при использовании для сравнения.

Я прочитал об этом дальше и узнал, что когда функция password_hash() используется для создания хэша, она также сохраняет значение соли внутри хеша? Например, если созданный хэш равен abcde12345, то может ли 12345 быть солт-значением?

Если это правда, то, глядя на хэш, можем ли мы сказать, что «эта» часть хеша на самом деле является значением соли? Всегда ли значение соли помещается в определенную позицию в хеше? Буду признателен, если кто-то поделится примером.

kelalaka avatar
флаг in
Вы полностью прочитали [сайт PHP] (https://www.php.net/manual/en/function.password-hash.php)? В разделе «Возвратные значения» или «См. Также» вы заметите, что [password_verify()] (https://www.php.net/manual/en/function.password-verify.php) благодарит за ввод текущего пароля и сохраненный хэш. и возвращает T/F !
Рейтинг:2
флаг si

Выходные данные любой обычной функции хеширования паролей состоят из настроек сложности, соли и дайджеста пароля, закодированных в некоторый формат, указанный функцией хеширования паролей. Функция проверки ожидает такой же формат и просто считывает из него соль. Этот сайт имеет хорошее объяснение хеш-функций Argon2. Например, для argon2id (рекомендуемый вариант для PHP password_hash) с паролем 12345, соль qwertyuiop, 1 итерация, 1024 памяти, длина хеша 32, параллелизм 1, вывод будет $argon2id$v=19$m=1024,t=1,p=1$cXdlcnR5dWlvcA$dSEO3lF0tmBRi3/HZFZqPJGv38CW35xf9Fcs+8ti0yk

Вы можете увидеть различные параметры, разделенные $ знаки.

Z3R0 avatar
флаг jp
Здравствуйте, у меня вопрос по поводу соли.Хранится ли соль с хэшем пароля или в виде открытого текста? Например, если у меня есть хэш 1234.abcde, а 1234 — это соль, возвращаемая функцией password_hash(), она тоже хэшируется или представлена ​​в виде открытого текста? Поэтому, когда я хочу проверить хэш, я просто добавляю 1234 к паролю в виде открытого текста и повторно выполняю функцию хеширования.
SAI Peregrinus avatar
флаг si
Соль (конечно) в открытом тексте: это не секрет (по определению «соль»). В примере хэша с использованием Argon2 это «cXdlcnR5dWlvcA», закодированный в BASE64, но, конечно, не зашифрованный. Кодирование необходимо для преобразования произвольных байтов (которые могут включать 0 байтов) в «строку» печатных символов ASCII, которая не может включать 0 байтов.
Рейтинг:1
флаг in

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

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

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

Z3R0 avatar
флаг jp
Здравствуйте, у меня вопрос по поводу соли. Хранится ли соль с хэшем пароля или в виде открытого текста? Например, если у меня есть хэш 1234.abcde, а 1234 — это соль, возвращаемая функцией password_hash(), она тоже хэшируется или представлена ​​в виде открытого текста? Поэтому, когда я хочу проверить хэш, я просто добавляю 1234 к паролю в виде открытого текста и повторно выполняю функцию хеширования.
флаг in
Соль хранится в виде открытого текста, она не хешируется. Он закодирован схемой, которую по своей конструкции легко отменить, подобно, например, кодировка base64, так как любой двоичный файл должен быть закодирован, чтобы быть сохраненным как обычный текст. Вы можете увидеть подробности в случае с bcrypt по адресу https://en.wikipedia.org/wiki/Bcrypt#Description.
Z3R0 avatar
флаг jp
Действительно спасибо вам

Ответить или комментировать

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