代码之家  ›  专栏  ›  技术社区  ›  RobertPitt

密码盐渍-从不匹配![关闭]

  •  -1
  • RobertPitt  · 技术社区  · 15 年前

    我很难弄清楚为什么用户密码哈希不起作用。

    我这样做的方式是正常的方法,在注册时我创建一个randam salt并与password和store结合,但是当我尝试匹配登录的密码时,它们失败了:(

    <?php
    class Model_users extends ModelType_DatabasePDO
    {
    
     //...
    
     public function CheckCredentials($username,$password)
     {
      $statement = $this->prepare('SELECT user_id,user_salt,user_password FROM users WHERE user_username = :u');
      $statement->bindValue(':u',$username);
    
      if($statement->execute())
      {
       $user_data = $statement->fetch(PDO::FETCH_OBJ);
    
       //Create a new hash with salt
       $combined = $this->CombineHash($password,$user_data->user_salt);
    
       //Check the combination is correct!
       if($combined == $user_data->user_password)
       {
        return true;
       }
    
       var_dump($user_data->user_salt,$combined);
       return false;
      }
      return false;
     }
    
     //...
    
     public function AddUser($userdata)
     {
      if($userdata['username'] && $userdata['password'] && $userdata['email'] && $userdata['nickname'])
      {
       $statement = $this->prepare('INSERT INTO users (user_username,user_password,user_salt,user_email,user_nickname) VALUES (:username,:password,:salt,:email,:nickname)');
    
       //Generate hashes
       $salt = $this->GenerateSalt();
       $password = $this->CombineHash($userdate['password'],$salt);
    
       //Generate Data block for insert
       $data = array(
        ':username' => $userdata['username'],
        ':password' => $password,
        ':salt'  => $salt,
        ':email' => $userdata['email'],
        ':nickname' => $userdata['nickname']
       );
    
       if($statement->execute($data))
       {
        return true;
       }
      }
      return false;
     }
    
     private function GenerateSalt()
     {
      //Create a random md5 string:
      $first = md5( rand(0,100) . time() . microtime() . uniqid() );
      $second = md5( rand(0,100) . time() . microtime() . uniqid() );
    
      for($i=0;$i<=32;$i++)
      {
       $string = '';
       if($i % 2)
       {
        $string .= $first[$i];
       }else
       {
        $string .= $second[$i];
       }
      }
      return md5($string);
     }
    
     private function CombineHash($password,$hash)
     {
      return md5($password . $hash);
     }
    }
    ?>
    

    传递到方法中的所有变量都是原始的,不是经过盐处理或加密的,只是经过验证:/

    1 回复  |  直到 15 年前
        1
  •  8
  •   atk    15 年前

    您的代码似乎有输入错误

     $password = $this->CombineHash($userdate['password'],$salt);
    

    $userdate 必须是 $userdat a (e必须是a)。

    推荐文章