我试图使用Yii的generatePasswordHash()函数,但每次都得到一个不同的哈希值。
$this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password);
这里有3个用密码 "test "创建的哈希值。
$2y$13$wsvC4i8YMwKKHJ2K5iYRG.Z0KBetOh3BctVpJN5pVkXGOcW85hRkO ,
$2y$13$QfV2Qxlj4F5gUh1wIL2WUewoZ55CKYKevjRmRqrenxq8L5ym5xX9. ,
$2y$13$rDArvLa8hnpDGiiDdCs7be4iTsr2T3XMXmnapynuD1i1ekbz8zF4m
有人知道这是怎么回事吗?
EDIT.当我尝试用
当我试着用 "test "来验证时
Yii::$app->getSecurity()->validatePassword($password, $this->password)
它返回false.
EDIT#2:函数看起来像这样。
public function validatePassword($password)
{
return Yii::$app->getSecurity()->validatePassword($password, $this->password);
}
$password是输入密码,$this->password是哈希值。
奇怪的是 password_verify($password, $this->password)
工作,但Yii的验证器不工作。
所有的哈希值都是正确的。因为哈希算法会对同一个密码做出不同的哈希值。在你的代码中,密码变量从哪里来?应该是密码字符串而不是哈希值。
$hash = "hashed version";
$password = "string password";
if (Yii::$app->getSecurity()->validatePassword($password, $hash)){
// password correct
}
补充一下fendi的答案。
每次Yii的generatePasswordHash()函数运行时得到不同的哈希值是正常的。
验证密码的哈希值需要'hash'中的'salt'。
哈希值中'$2y$13$'之后的前22个字符就是盐值。
validatePassword($password, $hash)函数从哈希值中获取盐分,使用盐分对$password进行哈希处理,如果密码正确的话,应该得到与$hash相同的哈希值。