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

盐被存储为散列的一部分。