хэш пароля — PHP значение функции password_hash не одинаково для каждой строки

Я пытаюсь хешировать пароль пользователя с помощью password_hash () Функция PHP. Но это функция хэширования, а не константа.

<?php
echo password_hash('a',PASSWORD_BCRYPT,array(
'cost' => 12
));
?>

Результат за 4-е время тестирования

1. $2y$12$SRmipqM7AsYkx3Xc8QGHNex69rGXeVyWGTYrh9T8sh1cP3UrdjfQi
2. $2y$12$zx.GUgtcake3wMfl3/YXXeG1.8mmHKyRruL3nWj8OmA.RbEYqeW6u
3. $2y$12$XQtmFplcehkgWLbGrOUsNOlXDU/NGrwZlt3HM88hLbUHXhjXNF4km
4. $2y$12$q9/OSZdDJw7af4Hw4MGlHeY7UMtWr9/Cj0nj/N6PaoilNoUBePt7O

3

Решение

Как некоторые предлагали использовать MD5, не используйте его для хеширования паролей.

Хорошо, теперь, чтобы ответить на ваш вопрос how to check a password matches

Password_Hash() заключается в создании хэша пароля, который создаст случайную соль с ним, этот хэш будет использоваться при хешировании.
ваш конечный результат будет: соль + хеш, тем не мение Вы можете дать ему salt с этим методом в его опциях, но давайте оставим это так, чтобы он делал это сам.

Password_Verify() использует параметр для пароля и один для хешированного пароля.
как я уже говорил, хешированный пароль — соль + хеш
что имеет смысл, что Password_Verify() нужны только эти, а не дополнительные под названием salt

Так что же происходит с Password_Verify() является то, что он вынимает соль и использовать Password_Hash() с этой солью.
затем проверьте, равен ли полученный хеш заданному хешу.
если это соответствует, то это правда, иначе это ложь.

Password_Hash () Doc

Password_Verify () Doc


Обновление 18-04-2018 (д-м-у)

ПРЕДУПРЕЖДЕНИЕ

Соляной вариант был осуждается по состоянию на PHP 7.0.0.

Теперь предпочтительнее просто использовать соль, которая генерируется по умолчанию.

Больше информации о Солении — ТАК Ответ ниже от Veve

Почему бы не использовать MD5 для хеширования паролей — PHP FaQ Answer

Почему бы не использовать MD5 для хеширования паролей — ТАК Ответ: Silverlightfox

8

Другие решения

Если вы хотите использовать password_hash() и получить константы хешей (не уверен во множественном числе …), добавить соль при его использовании. (но не вижу осторожность ниже)

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

<?php
echo password_hash('a',PASSWORD_BCRYPT,array(
'salt' => $salt_defined_for_the_user,
'cost' => 12,
));
?>

О соли, которую вы должны использовать, вот хорошее объяснение wmfrancia извлеченный отсюда:

засол

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

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


Я просто отвечаю здесь на ваше желание иметь постоянные хэши, но, как сказал halfer а также martinstoeckli в комментариях, а также отметил в официальном документе,

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

.

Вы действительно должны не создать свою собственную соль, функция пытается ее
Лучше всего создать безопасный и случайный. Когда вы храните пользовательский
соль, как показывает ваш пример, вы делаете то же самое, что и password_hash ()
тем не мение. Он включает соль в хеш-значение, поэтому функция
password_verify () может забрать его оттуда

Майк М. имеет подробное описание для использование password_verify() вместо этого в своем ответе.

2

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

Например, MD5 () всегда будет иметь пять хешей для одного и того же пароля.

Password_hash всегда дает вам разные строки, так как каждый раз, когда вы их запускаете, они содержат разную соль.

Когда вы извлекаете хеш-пароль из базы данных (например, на основании адреса электронной почты, предоставленного пользователем)
Password_verify будет читать всю строку, которая является солью + проход, вместе, будет использовать первые символы, которые являются солью, и будет использовать эту соль с простым паролем, предоставленным пользователем для ее шифрования.

Затем он сравнит результат с остатком хеша salt +, который был извлечен из базы данных (теперь оставшимся должен быть хеш .. без соли).

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

0
По вопросам рекламы [email protected]