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а.

Давайте будем гением компьютера.