yii CPasswordHelper: hashPassword и verifyPassword
Я думаю, что мне не хватает чего-то критического здесь. В функции CPasswordHelper::hashPassword
у нас есть строки:
$salt=self::generateSalt($cost); $hash=crypt($password,$salt); return $hash;
И в CPasswordHelper::verifyPassword
есть эта строка:
$test=crypt($password,$hash); return self::same($test, $hash);
Как насчет соли? По моему мнению, его даже не держали, но это не имеет никакого смысла, поэтому я предполагаю, что не понял его полностью.
CPasswordHelper работает как функции PHP password_hash () и password_verify () , они являются shellми вокруг функции crypt (). Когда вы создаете hashирование BCrypt, вы получите строку из 60 символов, содержащую соль.
// Hash a new password for storing in the database. $hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
Переменная $ hashToStoreInDb теперь будет содержать значение hashа, подобное этому:
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | salt = nOUIs5kJ7naTuTFkBy1veu | | | cost-factor = 10 = 2^10 iterations | hash-algorithm = 2y = BCrypt
Соль, которую вы можете найти после третьего $
, генерируется автоматически с помощью пароля_hash (), используя случайный источник операционной системы. Поскольку соль включена в результирующую строку, функция password_verify () или фактически обернутая функция склепа может извлекать ее оттуда и может вычислять hash с той же солью (и тот же коэффициент затрат). Эти два hashа тогда сопоставимы.
// Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($password, $existingHashFromDb);
Соль хранится как часть hashа.