【问题标题】:Yii2 - validate password (Hash is invalid error)Yii2 - 验证密码(哈希无效错误)
【发布时间】:2015-07-03 15:42:13
【问题描述】:

我正在尝试验证旧用户密码,以便他能够更改密码,但目前我收到 Hash is invalid 错误。

这是验证规则:

['password_old', function($attribute){
                if(!$this->validatePassword($this->{$attribute}))
                    $this->addError($attribute, 'Please Enter Your Old Password');
            }],

validatePassword方法:

    public function validatePassword($password){
            return Yii::$app->getSecurity()->validatePassword($this->salt . $password, $this->password);
        }

修改密码表格:

$form = ActiveForm::begin(
            [
                'enableAjaxValidation' => true,
                'action'               => 'user/changepassword',
                'id'                   => 'changePassword'
            ]
        );


    echo $form->field($model, 'password_old')->passwordInput( ['autocomplete' => 'off'] );
    echo $form->field($model, 'password')->passwordInput(['autocomplete' => 'off'])->label('New Password');
    echo $form->field($model, 'password_confirm')->passwordInput(['autocomplete' => 'off']);  

【问题讨论】:

  • 为什么是 $this->salt?你是故意加盐吗?哈希密码已经加盐。而且我不是 100% 确定,但看起来你比较 $this->salt 。 $password 和 $this->password 和 $this->password 是来自表单输入的原始新密码,但您应该将其与旧密码哈希进行比较。
  • 我在用户的更改通行证中有此错误。如何解决这个问题。 stackoverflow.com/questions/44218661/…

标签: yii yii2


【解决方案1】:

我解决了问题,将数据库中密码列的值从 varchar(128) 更改为 varchar(255) 并再次注册。

【讨论】:

【解决方案2】:

如果将 null 作为 $hash 传递给 Yii::$app->getSecurity()->validatePassword 方法,则会出现 Hash is invalid error 的另一个原因。

我建议你在你的代码中做这样的检查

public function validatePassword($password){
        if(is_null($this->password)) 
            return false;
        return Yii::$app->getSecurity()->validatePassword($this->salt . $password, $this->password);
    }

【讨论】:

  • 这里放什么盐?
【解决方案3】:

“哈希无效错误”,因为您的密码格式不正确。

为什么?

  • 当您在验证规则中调用 validatePassword 时,$this->password 不是存储在数据库中的密码,而是新密码 - 最近从您的表单提交。解决问题可以参考yii2-basic-appyii-advanced-app中的LoginForm类。

建议:

  • “Salt” 不是必需的,因为它已自动包含在函数 \Yii::$app->security->generatePasswordHash 中(PHP 5>= 5.5.0 password_hash

【讨论】:

    【解决方案4】:

    我也遇到了这个问题并解决了

    原因是我以前用sha1算法,转换成bcrypt(Yii::$app->security->generatePasswordHash)后遇到了这个问题。

    我以前的密码是使用 sha1 算法创建的,并且在数据库中。 当我将代码更改为新算法并想登录时,我错了。

    如果您使用新算法重置以前的密码,问题就解决了。

    【讨论】:

      【解决方案5】:

      当数据库中比较的密码不能是哈希值时,你会得到这个错误! 字段值时出现此错误
      " $2y$13$TvlDZ5RgBL7Cr1LR9JovfOVEyMwpD6x1dy9sYlngzUIKeuEaqqiry"(第一个字符是空格)。 我删除了空格字符,然后它起作用了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        相关资源
        最近更新 更多