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

那盐呢?据我了解,它甚至没有被保留,但没有任何意义,所以我想我还没有完全理解它


慕田峪9158850
浏览 946回答 3
3回答

米脂

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您可以在第三个盐之后找到盐$,它由password_hash()使用操作系统的随机源自动生成。因为盐包含在结果字符串中,所以函数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);

喵喔喔

盐作为哈希的一部分存储。

阿波罗的战车

由生成的散列CPasswordHelper包含一个$符号,后跟所选算法的代码,另一个$是成本因素(注意:如果看到10,则实际上意味着2 ^ 10次迭代!),另一个$是a固定数量的字符为“ salt”,然后直接加上实际的哈希。
打开App,查看更多内容
随时随地看视频慕课网APP