Я использую Zend\Crypt\Password\Bcrypt
для хранения паролей, зашифрованных в базе данных. Но теперь я посмотрел немного ближе, и, похоже, я не понимаю метод проверки этого класса :
/** * Verify if a password is correct against a hash value * * @param string $password * @param string $hash * @throws Exception\RuntimeException when the hash is unable to be processed * @return bool */ public function verify($password, $hash) { $result = crypt($password, $hash); return Utils::compareStrings($hash, $result); }
Функциональность в соответствии с комментарием «Проверить правильность пароля относительно хеш-значения»
Но когда я проверяю функцию php crypt, она вызывает второй аргумент, это необязательная строка $salt
а не $hash
строка для проверки.
Как я читаю это: сначала он использует переданный $hash
чтобы зашифровать $password
который мы хотим проверить, и затем он сравнивает тот же $hash
он использовал в качестве соли с зашифрованным $result
!?
Так что мне здесь не хватает? Либо php-doc неверен, либо я не понимаю, что происходит, или что-то пропустил в документах.
Bcrypt hash имеет хорошо документированную структуру, например, этот хеш:
$2y$10$aPk2mEEIkGonq6/JGr0OKOhYOdgomu61ARBjDLgb0UmHM4L8f7Hxe
String $2y$
– префикс, 10
– стоимость, aPk2mEEIkGonq6/JGr0OKO
– соль (128 бит, base64, закодированные 22 символа) и hYOdgomu61ARBjDLgb0UmHM4L8f7Hxe
– результат хэша.
функция crypt
распознает этот формат и использует соответствующую часть его как соль, поэтому нет никакой проблемы передать весь хеш в качестве второго параметра.