2015-11-27 51 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