Я пытаюсь хешировать пароль пользователя с помощью password_hash () Функция PHP. Но это функция хэширования, а не константа.
<?php
echo password_hash('a',PASSWORD_BCRYPT,array(
'cost' => 12
));
?>
1. $2y$12$SRmipqM7AsYkx3Xc8QGHNex69rGXeVyWGTYrh9T8sh1cP3UrdjfQi
2. $2y$12$zx.GUgtcake3wMfl3/YXXeG1.8mmHKyRruL3nWj8OmA.RbEYqeW6u
3. $2y$12$XQtmFplcehkgWLbGrOUsNOlXDU/NGrwZlt3HM88hLbUHXhjXNF4km
4. $2y$12$q9/OSZdDJw7af4Hw4MGlHeY7UMtWr9/Cj0nj/N6PaoilNoUBePt7O
Как некоторые предлагали использовать MD5, не используйте его для хеширования паролей.
Хорошо, теперь, чтобы ответить на ваш вопрос how to check a password matches
Password_Hash()
заключается в создании хэша пароля, который создаст случайную соль с ним, этот хэш будет использоваться при хешировании.
ваш конечный результат будет: соль + хеш, тем не мение Вы можете дать ему salt
с этим методом в его опциях, но давайте оставим это так, чтобы он делал это сам.
Password_Verify()
использует параметр для пароля и один для хешированного пароля.
как я уже говорил, хешированный пароль — соль + хеш
что имеет смысл, что Password_Verify()
нужны только эти, а не дополнительные под названием salt
Так что же происходит с Password_Verify()
является то, что он вынимает соль и использовать Password_Hash()
с этой солью.
затем проверьте, равен ли полученный хеш заданному хешу.
если это соответствует, то это правда, иначе это ложь.
Обновление 18-04-2018 (д-м-у)
ПРЕДУПРЕЖДЕНИЕ
Соляной вариант был осуждается по состоянию на PHP 7.0.0.
Теперь предпочтительнее просто использовать соль, которая генерируется по умолчанию.
Больше информации о Солении — ТАК Ответ ниже от Veve
Почему бы не использовать MD5 для хеширования паролей — PHP FaQ Answer
Почему бы не использовать MD5 для хеширования паролей — ТАК Ответ: Silverlightfox
Если вы хотите использовать 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()
вместо этого в своем ответе.
Я думаю, что вас смущают старые методы, которые производят один и тот же хэш, независимо от того, сколько раз вы пытаетесь.
Например, MD5 () всегда будет иметь пять хешей для одного и того же пароля.
Password_hash всегда дает вам разные строки, так как каждый раз, когда вы их запускаете, они содержат разную соль.
Когда вы извлекаете хеш-пароль из базы данных (например, на основании адреса электронной почты, предоставленного пользователем)
Password_verify будет читать всю строку, которая является солью + проход, вместе, будет использовать первые символы, которые являются солью, и будет использовать эту соль с простым паролем, предоставленным пользователем для ее шифрования.
Затем он сравнит результат с остатком хеша salt +, который был извлечен из базы данных (теперь оставшимся должен быть хеш .. без соли).
Я надеюсь, что это помогло вам понять, почему вы все время получаете разные строки и используете хэш пароля для одного и того же пароля.