2016-10-29 2 views
1

Я новичок в password_hash и password_verify, и они кажутся наиболее эффективным способом безопасного хранения паролей!Работа с Password_hash и password_verify

Я заметил, что password_hash производит разные хэши для одного и того же plain-text значение every time!

Это означает, что если пользователь пытался создать учетную запись с паролем (thisIsMyPassword) он будет генерировать хэш, как этот $2y$10$VCNH8ndve8hwbvLJ2nMHtOsEiigE4zA7ViADxCJfq9bmUCmkNkcce,

И если другой или тот же пользователь попытался создать другой аккаунт с тем же паролем, т.е. (thisIsMyPassword) учетная запись будет создана, и хэш-значение пароля будет примерно $2y$10$Hqssc5nn3pzgfwqVwQrQz.Ny71q972RXmCmyV9ykywG8iELbsf47a!

Теперь вы видите то же значение, то есть (thisIsMyPassword) привело к разным хэшам!

В порядке?

Можно ли использовать те же пароли пользователей, если хеш-пароль отличается от базы данных?

+0

Я не знаю, что вы подразумеваете под 'password_hash', но тот факт, что вы получаете разные результаты для одного и того же ввода, предполагает, что вы ** НЕ ** используете реальное хеширование. Реальное хеширование будет ** ВСЕГДА ** возвращать один и тот же хэш для одного входа. – FDavidov

+0

Я не знаю, использовалась ли ранее функция php 'password_hash', но эта функция возвращает разные хэши для одного и того же значения текстового значения (это его точка)! И, понятно, вы не очень хорошо поняли мой вопрос! – UXnew

+0

Нет, я никогда не использовал PHP, но использовал хеширование в списке приложений, и ** всегда ** возвращал одно и то же значение для одного и того же ввода. Вы можете рассмотреть другой вариант, ** tokenization ** (хотя я сомневаюсь, что он поддерживается в PHP. – FDavidov

ответ

2

хэш пароля включает в себя так называемую соль, небольшое случайное значение, которое здесь, чтобы предотвратить атаки по словарю, вот что PHP руководство говорит:

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

Значение, которое вы получаете, как выход, это на самом деле не простой хэш, но строка сделана из - алгоритма ид, соли и HASH (пароль, соль).

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

+0

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

+0

Нет прямого способа, вы можете проверить, используется ли пароль, когда используется соленый хеш. Кроме того, возможность проверки того, что пароль уже используется какой-либо другой учетной записью пользователя, делает уязвимость самой, поскольку вы можете использовать ее для обнаружения того, что другая учетная запись пользователя уже использует пароль, который вы только что пытались установить, и один раз вы знаете, что у вас есть действующий пароль, и вы можете просто применить его ко всем учетным записям пользователей, пока ваша атака не удастся. – zeppelin

+0

Большое вам спасибо за ответ на мой вопрос и спасибо всем остальным, кто пытался помочь! Я просто пошел на Facebook и Twitter, чтобы проверить это. FIRST: я создал учетную запись с паролем 'TESTPASS_1', и учетная запись была создана, а затем я создал другую учетную запись с тем же паролем, и учетная запись была создана (Facebook и Twitter не отображали ошибку, указав пароль' TESTPASS_1' уже используется или принимается!) – UXnew

Смежные вопросы