yii CPasswordHelper: hashPassword and verifyPassword

旧城冷巷雨未停 提交于 2019-11-26 05:56:41

问题


I think I\'m missing something critical here. In the CPasswordHelper::hashPassword function we have lines:

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

return $hash;

And in the CPasswordHelper::verifyPassword there is this line:

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

return self::same($test, $hash);

What about the salt? To my understanding its not even beeing kept, but it doesn\'t make any sense, so I\'m guessing I didn\'t understand it completely.


回答1:


CPasswordHelper works like PHP's functions password_hash() and password_verify(), they are wrappers around the crypt() function. When you generate a BCrypt hash, you will get a string of 60 characters, containing the salt.

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

The variable $hashToStoreInDb will now contain a hash-value like this:

$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |                     |
 |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
 |  |  |
 |  |  salt = nOUIs5kJ7naTuTFkBy1veu
 |  |
 |  cost-factor = 10 = 2^10 iterations
 |
 hash-algorithm = 2y = BCrypt

The salt you can find after the third $, it is generated automatically by password_hash() using the random source of the operating system. Because the salt is included in the resulting string, the function password_verify(), or actually the wrapped crypt function, can extract it from there, and can calculate a hash with the same salt (and the same cost factor). Those two hashes are then comparable.

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



回答2:


The salt is being stored as part of the hash.



来源:https://stackoverflow.com/questions/20394137/yii-cpasswordhelper-hashpassword-and-verifypassword

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!