У меня есть следующая функция, которая хэширует пароль и сохраняет его в базе данных. Я пытаюсь использовать функцию password_hash в php 5.5, но это дает мне странные результаты.
function hashpass($password) { include("includes/config.php"); $password = password_hash($password, PASSWORD_DEFAULT); return $password; }
Затем я выводим результат для того же статического пароля, который я просто тестирую как «testpassword», и он продолжает давать мне разные хэши. Почему это? если он продолжает делать это, я никогда не смогу проверить пароль, потому что он никогда не даст такой же хеш для одной и той же строки.
Есть ли что-то, что мне нужно настроить или установить перед рукой, чтобы это работало правильно?
Когда вы вводите пароль с password_hash
, генерируется случайная соль , используется в процессе хеширования и добавляется к результату. Это точно для того, чтобы избегать одинаковых паролей, приводящих к одному и тому же хэшу каждый раз; чтобы избежать легкой генерации радужных столов. (Все термины, которые вы должны, вероятно, google. :))
Чтобы проверить хэш, сгенерированный с помощью password_hash
вам нужно использовать password_verify
, который использует соль, встроенную в хеш, для воспроизведения и сравнения хеша из другого пароля открытого текста.
Хеши, сгенерированные password_hash
(и наиболее хорошие алгоритмы хэширования пароля), соленые. Это означает, что дополнительный набор случайных данных добавляется к каждому паролю до, а иногда и во время хэширования.
Общий формат для хэшей паролей: ##xxxxxxOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
, где:
##
– это идентификатор алгоритма хэширования, xxxxxx
– соль, и OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
– это хешированный пароль. При сравнении сохраненного хэша с заданным текстовым паролем алгоритм будет принимать часть хеша ##xxxxxx
и использовать его для вычисления нового хеша пароля (например, ##xxxxxxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
). Это они сравнивают два хэша, и если они равны, он может предположить, что данный пароль с четким текстом был таким же, как и исходный пароль.
Поскольку это отличается от статических хэшей, вы должны использовать password_hash
для первоначального хеширования пароля при регистрации или смене password_verify
и password_verify
для проверки правильности заданного пароля.