3

我正在尝试在 Yii 中实现 phpass 身份验证,但是每次都失败。我一直在阅读许多 SO 文章,但还没有找到解决方案,所以我认为这一定是 Yii 特定的问题。

在 User.php 我保存散列密码:

public function beforeSave() {
    $phpass = new PasswordHash(8, false);
    $hash = $phpass->HashPassword($this->user_pass);
    $this->user_pass = $hash;
    return true;
}

在 UserIdentity 我正在检查密码:

public static function isPasswordValid($plainPass, $hashedPass) {
    $phpass = new PasswordHash(8, false);
    $isValid = $phpass->CheckPassword($plainPass, $hashedPass);


    if($isValid){
        return true;
    }

    return false;
}

$hashedPass从数据库中出来,plainPass是用户刚刚输入表单但$isValid一直返回 false 的内容。事实上,我从数据库中取出散列密码并手动应用它,但它仍然失败:

$isValid = $phpass->CheckPassword('password', '$2a$08$P9X8duz7S8LOysz1XIn3fe/YYW3dwAs2busSBIX/QnZhKH/R9/H1S')

我已经检查以确保在插入时数据库中的散列密码没有被截断,并且它不是......我已经根据varchar 60另一篇 SO 文章调整了我的密码字段,但这没有帮助......

编辑:似乎如果我手动将哈希粘贴到数据库字段中,则身份验证在通过以下方式生成后起作用:

echo $phpass->HashPassword('password');
4

1 回答 1

3

问题可能出在 beforeSave 中。user_pass 每次保存用户时都会散列。如果您保存用户两次,您的密码将被哈希两次,因此无用。

我将 phpass 与 yii 一起使用没有问题,但是如果它是由用户手动设置的,我只会散列密码。

仅当用户修改/设置密码时才尝试哈希密码。

于 2013-02-05T17:44:09.650 回答