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()一样工作 ,它们是crypt()函数的包装器。 当你生成一个BCrypt哈希,你会得到一个60个字符的string,包含盐。
// Hash a new password for storing in the database. $hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
variables$ hashToStoreInDb现在将包含一个像这样的散列值:
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | salt = nOUIs5kJ7naTuTFkBy1veu | | | cost-factor = 10 = 2^10 iterations | hash-algorithm = 2y = BCrypt
你可以在第三个$
之后findsalt,它是由password_hash()使用操作系统的随机源自动生成的。 由于salt包含在结果string中,函数password_verify()或者实际上包裹的crypt函数可以从那里提取出来,并且可以用相同的盐(以及相同的成本因子)计算出一个哈希值。 那两个哈希是可比的。
// 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);
盐被存储为散列的一部分。