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);

А как насчет соли? По моему мнению, его даже не держат, но это не имеет никакого смысла, поэтому я предполагаю, что не понял его полностью.

Ответ 1

CPasswordHelper работает как функции PHP password_hash() и password_verify(), они являются обертками вокруг функции crypt(). Когда вы создаете хэширование BCrypt, вы получите строку из 60 символов, содержащую соль.

// Hash a new password for storing in the database.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

Переменная $hashToStoreInDb теперь будет содержать хеш-значение, подобное этому:

$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |                     |
 |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |
 |  |  salt = nOUIs5kJ7naTuTFkBy1veu
 |  |
 |  cost-factor = 10 = 2^10 iterations
 |
 hash-algorithm = 2y = BCrypt

Соль, которую вы можете найти после третьего $, генерируется автоматически с помощью пароля_hash() с использованием случайного источника операционной системы. Поскольку соль включена в результирующую строку, функция password_verify() или фактически обернутая функция склепа может извлекать ее оттуда и может вычислять хэш с той же солью (и тот же коэффициент затрат). Эти два хеша тогда сопоставимы.

// 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);

Ответ 2

Соль хранится как часть хеша.