2016-02-26 107 views
-1

我在使用password_hash和password_verify函數驗證密碼時遇到了麻煩。 由於某些原因,它總是返回false。PHP - password_verify總是返回false

散列存儲在數據庫中,當用戶提供電子郵件和密碼時,如果存在提供的電子郵件的用戶記錄,則提供的通過和來自該用戶記錄的散列被驗證(這將返回false ,提供正確的密碼)。

代碼波紋管是用於測試目的,因爲它不是在真實背景下正常工作(與存儲在數據DATABSE)

繼承人一些代碼。

<?php 
     //create random password with 15 chars 
     $pass = generate_random_string(15); 
     $hash = password_hash($pass, PASSWORD_BCRYPT); 
     var_dump(password_verify($pass, $hash)); 
     //returns bool(true) 

直到這一部分一切正常,它創建一個pass,哈希它,當驗證返回true時。 現在怪異的部分。

 if (isset($_GET['pass']) && 
      isset($_GET['hash'])) { 

      var_dump(password_verify($_GET['pass'], $_GET['hash'])); 
      //returns bool(false) 
     } 
    ?> 

如果我採用先前生成的值(pass和hash)並傳遞它們具有url參數並驗證它們,則返回false。

我在這裏做錯了什麼?

UPDATE

轉儲$ _GET數組顯示正確的參數和值。

+0

您需要提供'password_verify'功能以及 – Derek

+0

可以還轉儲$ _GET數組 - 我認爲你可能會假設一些在那裏不正確的東西...... –

+1

當用戶發送密碼時,'hash'是否應該被存儲和使用? –

回答

2

試戴追加到URL編碼前值:

$pass = generate_random_string(15); 
$hash = password_hash($pass, PASSWORD_BCRYPT); 
var_dump(password_verify($pass, $hash)); 
$pass_encoded = urlencode($pass); // PASS THIS IN THE URL 
$hash_encoded = urlencode($hash); // PASS THIS IN THE URL 

而對其進行解碼:

if (isset($_GET['pass']) && isset($_GET['hash'])) { 
    var_dump(password_verify(urldecode($_GET['pass']), urldecode($_GET['hash']))); 
} 
+0

Bamn。看起來你幾秒鐘就打敗了我。 –

+0

對不起,但這不能解決問題,返回相同的結果。不管怎麼說,還是要謝謝你 –