无法使用yii的passwordhelper验证散列密码

时间:2014-04-29 13:07:30

标签: yii

不确定有什么问题,但它说我的电子邮件/密码不正确。这仅在我的密码经过哈希处理时发生。只是寻找一个简单的密码哈希,我不需要复杂的东西。

在我的UserIdentity中。我尝试了几种方法,但都没有。

//...stuff here

    $loginSuccess = false;
    if ($user->hashed === 'Y') {
    $loginSuccess = (md5($this->password) === $user->password);
    //$hash= CPasswordHelper::hashPassword($this->password);
    //  if(CPasswordHelper::verifyPassword($user->password, $hash))
    //      $loginSuccess=true;
            } else {
            $loginSuccess = ($this->password === $user->password);
        }
            // Login failure
        if($loginSuccess==false) {
//...stuff here

在我的控制器中:

$model=new LoginForm;
        // if it is ajax validation request
        if(Yii::app()->request->isAjaxRequest)
        {
            if(isset($_POST['LoginForm']))
            {
                $model->attributes=$_POST['LoginForm'];
                $password = $_POST['LoginForm']['password'];
                $hash = CPasswordHelper::hashPassword($password);

                if (CPasswordHelper::verifyPassword($model->password, $hash))
                {
                    if($model->validatePassword($password) && $model->login())
                    { //do stuff if okay

加入网站后:

if(isset($_POST['User']))
        {
            $model->attributes=$_POST['User'];
            $hash = CPasswordHelper::hashPassword($_POST['User']['password']);
            $model->password = $hash;

            if($model->validate())

2 个答案:

答案 0 :(得分:2)

检查代码/问题中的前两行注释行

  $hash= CPasswordHelper::hashPassword($this->password); and
  if(CPasswordHelper::verifyPassword($user->password, $hash))

在这里,您正在哈希用户输入密码,并且您正在验证带有哈希字符串的哈希字符串。这是一个简单的错误。如果是verifyPassword,您必须使用哈希字符串验证用户输入密码

hashPassword从用户密码对和随机盐生成安全哈希。这就是您存储在数据库中的内容。在您的代码中,$ user-> password返回用户密码的哈希值。

但是verifyPassword会验证使用您存储在数据库中的哈希值在登录页面中输入的密码。现在检查编码......

创建用户时

 $passHash=CPasswordHelper::hashPassword(trim($_POST['LoginForm']['password']));
 //Store this hash in Database

处理登录时

            //user input
            $pass='pa123456'; 

            //which is comming from db. In your case $user->password
            $hash='$2a$13$35cIyyLPznkG8xK.d0NbW.hBGl5fWDYaleZAN4cYECoNZ1C6BLaA6'; 

            //verify password
            if (CPasswordHelper::verifyPassword($pass, $hash))
            {
                echo "good";
            }
            else
            {
                echo "Bad";
            }

答案 1 :(得分:0)

我相信我在CPasswordHelper :: verifyPassword()中发现了一个漏洞。我没有时间仔细检查它,所以我只是将这一行添加到功能的开头,绕过剩下的部分:

/* this library's ::same class seems not to be working */
if($password == $hash)               
  return true; 
else
  return false;

我没有找到为什么需要$ test = crypt($ password,$ hash)的原因,但是对加密有深入了解的人肯定会得到我无法提供的答案。

所以一个简单的字符串比较做了一个更简单的技巧,让我继续下去,直到我可以坐下来做我的作业。可以帮助找到真相吗?