2015-11-27 39 views
0

我想验证我的存储哈希密码与用户输入插入。在哈希验证错误在PHP

说什么理论......

约password_hash机制读取后password_verify,我意识到,在理论上,所插入的字符串会被用哈希相比,至少在我的情况下,存储在站点数据库中。

发生了什么事,我...

注册我的用户password_hash,然后验证我用password_verify登录。如果我很好,代码是正确的,这个函数应该用存储的散列验证用户的输入(即使它是纯文本(?))。

让我们来看看代码:

注册代码:

$passwordHash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 12)); 

注:有更多的代码,但我想这是最重要的一部分,所以我决定只这部分粘贴。

登录代码:

<?php 
//controller! 
    require "../model/backend.php"; 

    $username = $_POST['user']; 
    $password = $_POST['password']; 

    $dbcom = new dbInteraction; 
    $dbcom->admlog($username, $password); 
    $dbcom->conclose(); 

?> 

验证码:

$this->username = $username; 
     $this->password = $password; 
     //$this->pdo = $pdo; 
     //$adm = 1; 

     $myquery = 'SELECT username, password, isadmin FROM users WHERE username = :username';// AND password = :password'; 

     $stmt = $this->pdo->prepare($myquery); 
     $stmt->bindParam(':username', $username, PDO::PARAM_STR); 

     $stmt->execute(); 
     $user = $stmt->fetch(PDO::FETCH_ASSOC); 


     if($user === false){ 

      die('1Incorrect username/password combination!'); 
     } else{ 


     //Compare the passwords. 
      $dbpass = $user['password']; 
      echo $dbpass; 
      echo '<br>bd<br>input<br>'; 
      echo $password; 
      $validPassword = password_verify($dbpass, $password); 
      echo '<br>debug <br>'; 
      echo 'pre pass:<br>'; 
      echo $validPassword; 

      if($validPassword){ 

       //Provide the user with a login session. 
       $_SESSION['user_id'] = $user['username']; 
       $_SESSION['logged_in'] = time(); 


       //header('Location: home.php'); 
       exit; 
      }else{ 

       die('<br>no pass--Incorrect username/password combination!'); 
      } 
    } 

我必须在我的代码中的一些理论基础问题,或者它只是坏编码?我仍然在努力实现。

非常感谢。

+4

主要问题,我用你的代码看到的是你的params用于在'password_verify'似乎是围绕着错误的方式。接下来,它应该是一个纯文本密码,你传递给第一个参数(就像你期望的用户输入一样),作为背后的场景,将散列密码与第二个参数进行比较。 –

+0

我不能相信我把这些参数放在周围...阅读我阅读的内容...谢谢@JonStirling。顺便说一句,它足够安全吗?谢谢。 –

+1

密码API是否足够安全?是的,目前。我建议查看其他密码API函数,特别是[password_needs_rehash](http://php.net/manual/en/function.password-needs-rehash.php)并使用“PASSWORD_DEFAULT”。同时使用这两个参数意味着如果PHP添加更安全的算法,您的哈希可以自动更新以供您存储。 –

回答

1

问题出在password_verify参数的顺序。

应该是这样$validPassword = password_verify($password, $dbpass); 或通用词: $validPassword = password_verify('String to verify', 'Saved password');

特别感谢@JonStirling