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