Двойной пароль_hash php

Мне было интересно, возможно ли использовать пароль_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")

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

Поэтому мои вопросы,

  1. Можно ли сделать это?
  2. Полезно ли это сделать?

Весь смысл 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 () добавляет случайную соль, которая становится частью полученного хэша. Эта соль необходима для проверки пароля, но при вызове функции дважды вы теряете первую соль.