Мне было интересно, возможно ли использовать пароль_hash для моих паролей пользователей на моем веб-сайте.
Итак, скажем так:
Пользователь регистрируется на моем сайте, они вводят пароль, мы будем называть этот input
.
При создании учетной записи их пароль равен $firstHash = password_hash($input, PASSWORD_BCRYPT)
(например, саке, скажем, этот хеш для этого «ThisFirstHash»
После того, как их пароль хэшируется, он снова хешируется $firstHash = password_hash($firstHash, PASSWORD_BCRYPT)
(Например, саке, скажем, этот хэш на «thisSecondHash»)
Этот второй хэш – это то, что хранится в базе данных, поэтому теперь, когда они входят в систему, сервер должен расшифровать хеш-хеш.
Когда пользователь входит в систему, они снова вводят свой пароль, мы снова вызываем этот input
сервер затем должен $loginHash1 = password_hash($input, PASSWORD_BCRYPT)
вход для сравнения с сохраненным хешем $loginHash1 = password_hash($input, PASSWORD_BCRYPT)
Сервер сравнивает новую переменную loginHash1
с сохраненным хешем password_verify($loginHash1,"thisSecondHash")
Если первый хеш совпадает, сравните второй хеш
password_verify($input,"thisFirstHash")
Я не мог заставить это работать должным образом в моей небольшой тестовой среде, я подозреваю, что это связано с тем, что рандомизированная соль различается во время фазы входа при повторной перемотке ввода.
Поэтому мои вопросы,
Весь смысл API-интерфейса хэширования паролей – упростить реализацию безопасного хэширования. Добавление сложности по мере того, как вы не добавите никакой безопасности, и это затрудняет отладку вашего кода. Используйте один password_hash
и один password_verify
. PHP PASSWORD_DEFAULT
выбран, чтобы быть очень сильным уже:
Для хэша
$hash = password_hash($cleartext, PASSWORD_DEFAULT)
Проверять
$isCorrect = password_verify($cleartext, $hash);
Если вас не устраивают очень сильные значения по умолчанию для PHP, вы можете посмотреть настройки cost
. Но это действительно не нужно. Документы говорят :
password_hash () использует сильный хеш, генерирует сильную соль и автоматически применяет правильные раунды. password_hash () – простая оболочка crypt () и совместимая с существующими хэшами паролей. Рекомендуется использовать password_hash ().
Функция password_hash()
уже делает повторно хэш-пароль, это называется растяжкой ключей и делается для того, чтобы сделать атаки грубой силы более сложными. Поэтому нет смысла использовать BCrypt дважды.
Причина, по которой это не работает в вашем случае, заключается в том, что password_hash () добавляет случайную соль, которая становится частью полученного хэша. Эта соль необходима для проверки пароля, но при вызове функции дважды вы теряете первую соль.