yii CPasswordHelper:hashPassword和verifyPassword

yii CPasswordHelper:hashPassword和verifyPassword,hash,yii,passwords,salt,Hash,Yii,Passwords,Salt,我想我遗漏了一些关键的东西。在函数中,我们有行: $salt=self::generateSalt($cost); $hash=crypt($password,$salt); return $hash; 这句话的意思是: $test=crypt($password,$hash); return self::same($test, $hash); 盐呢?据我所知,它甚至没有被保留,但它没有任何意义,所以我猜我没有完全理解它。盐作为散列的一部分存储。CPasswordHelper

我想我遗漏了一些关键的东西。在函数中,我们有行:

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

return $hash;
这句话的意思是:

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

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

盐呢?据我所知,它甚至没有被保留,但它没有任何意义,所以我猜我没有完全理解它。

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

CPasswordHelper的工作原理与PHP的函数类似,它们是围绕crypt()函数的包装。生成BCrypt哈希时,将得到一个包含salt的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
您可以在第三个
$
之后找到的salt,它是由密码\u hash()使用操作系统的随机源自动生成的。由于salt包含在结果字符串中,因此函数password_verify()或实际包装的crypt函数可以从中提取salt,并可以使用相同的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);

你能不能更具体一点?当我在
db
中存储密码时,我用salt对文本密码进行加密,并得到某种散列。现在,当我想验证用户输入的密码是否合法时,我不需要用同样的密码加密吗?如果我用散列加密它,我不会得到其他东西吗?正如@martinstoeckli已经指出的那样,
CPasswordHelper
生成的散列包含一个
$
符号,后跟所选算法的代码,另一个
$
,成本因素(注意:如果你看到10,它实际上意味着2^10次迭代!),另一个
$
,固定数量的字符是salt,后跟实际哈希。