yii CPasswordHelper:hashPassword和verifyPassword

use*_*466 5 passwords hash salt yii

我想我在这里缺少一些关键的东西.在CPasswordHelper::hashPassword函数中我们有行:

$salt=self::generateSalt($cost);  
$hash=crypt($password,$salt);  

return $hash;
Run Code Online (Sandbox Code Playgroud)

CPasswordHelper::verifyPassword这条线上:

$test=crypt($password,$hash);  

return self::same($test, $hash);
Run Code Online (Sandbox Code Playgroud)

盐怎么样?根据我的理解,它甚至没有保留,但它没有任何意义,所以我猜我完全不理解它.

mar*_*kli 22

CPasswordHelper的工作方式类似于PHP的函数password_hash()password_verify(),它们是crypt()函数的包装器.生成BCrypt哈希时,您将获得包含盐的60个字符的字符串.

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

变量$ hashToStoreInDb现在将包含这样的哈希值:

$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |                     |
 |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |
 |  |  salt = nOUIs5kJ7naTuTFkBy1veu
 |  |
 |  cost-factor = 10 = 2^10 iterations
 |
 hash-algorithm = 2y = BCrypt
Run Code Online (Sandbox Code Playgroud)

你可以在第三个之后找到的盐$,它是由password_hash()使用操作系统的随机源自动生成的.因为salt包含在结果字符串中,所以函数password_verify()或实际上包装的crypt函数可以从那里提取它,并且可以计算具有相同salt的哈希值(以及相同的成本因子).那两个哈希值可以比较.

// 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);
Run Code Online (Sandbox Code Playgroud)