2014-11-20 127 views
3

UPDATE 所以這是一個令人尷尬的愚蠢入場,但問題是,我已經存儲在數據庫中的哈希是的「密碼」 哈希包括引用,我寫的查詢沒有問題,問題出在椅子和鍵盤之間。PHP password_hash和password_verify看遍仍不能正常工作

所以這是一個經常被問到的問題,我已經看遍了所有的stackoverflow和谷歌試圖找出答案,並有這樣的票價不成功。

我有一個表「代理」與登錄名和密碼分配給每個代理。密碼字段是255

長度的VARCHAR這裏是我的PHP代碼:

 $conn = new mysqli("localhost", "VABEN", "**********", "VABen"); 
    if($conn->connect_error) 
    { 
     die("Connection failed!" . $conn->connect_error); 
    } 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 

    $s = $conn->prepare("SELECT `agent_password` FROM `VABen`.`agents` WHERE `agent_login`=?"); 
    $s->bind_param("s", $username); 
    $s->execute(); 

    $hash = $s->get_result(); 
    $hash = $hash->fetch_array(MYSQLI_ASSOC); 

    $testpw = password_hash('password', PASSWORD_DEFAULT); 
    echo "Comparing submitted password to locally created hash $testpw which has a length of " . strlen($testpw) . "<br>"; 
    if(password_verify($password, $testpw)) 
    { 
     echo "Password '$password' matches with hash $testpw<br>"; 
    } 
    else 
    { 
     echo "Password '$password' does not match with hash $testpw<br>"; 
    } 
    echo "<br>"; 

    echo "Supplied Password: '$password'<br>"; 
    echo "Queried Hash: " . $hash['agent_password'] . " which has a length of " . strlen($hash['agent_password']) . "<br>"; 
    echo "Result of password_verify: "; 
    if(password_verify($password, $hash['agent_password'])) 
     echo "true<br>"; 
    else 
     echo "false<br>"; 

我很茫然。當我提供一個本地創建的password_hash副本時,它似乎只能工作,如果我在MySQL數據庫中使用本地創建的副本,它將失敗。

任何想法?

+0

並且爲了澄清,當我提供本地生成的password_hash副本時,password_verify返回true,但當我提供從MySQL表中提取的哈希時,則不會返回true。 – 2014-11-20 20:45:15

+0

因此,使用'$ testpw'進行測試是正確的嗎?然後我只能想到保存哈希到數據庫出錯了。當您首先保存'$ testpw'時會發生什麼,然後從數據庫中選擇該記錄? – redelschaap 2014-11-20 21:59:39

+0

定義「it failed」 – ircmaxell 2014-11-20 22:58:22

回答

1

存儲哈希

你檢查這agent_password是存儲所產生的哈希:

password_hash($password, PASSWORD_DEFAULT); 

檢查PDO標準

可能沒有影響,但它下面的標準是值得bindParam的不同實現。如果您使用的?方法,那麼:

$s->bind_param(1, $username); 

有在腳本PDO的幾個奇怪的實現,嘗試調整:

$s->execute(); 

//$hash = $s->get_result(); 
//$hash = $hash->fetch_array(MYSQLI_ASSOC); 
$hash = $s->fetchColumn(); 

變化$hash['agent_password']只是$hash,而不是後續調用。

測試基本操作

測試如下因素:

// $password = $_POST["password"]; 
$password = "password"; 

之後,也儘量保存散列,並再次取回,從MySQL,之前的最後驗證一步。

最後

我深深的懷疑,什麼是存儲在agent_password其實也不是與password_hash散列密碼。

+0

這是從上面我所輸出: '密碼在本地創建的哈希$ 2Y比較$ 10 $ NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aa其中有60' ''' 密碼「密碼」的長度與哈希$ 2Y匹配$ 10 $ NrTgd5b.qVnhs.smiZemHOQWM8PQ8q11Sfiyw1Bm1Wex6t3qpE6aa' '提供的密碼:「password'' ''' 散列所查詢:$ 2Y $ 10 $ 668gODHJ14N7Z6i17lboLOHBQ6mkdxz3g99brUoeoxRBHSeri80ZK其具有60' ''' 的password_verify結果的長度:FALSE' – 2014-11-21 00:00:29

+0

那麼你有它。提供的密碼與存儲的密碼散列不匹配。也許''PASSWORD_DEFAULT'自該密碼創建後已更改? – 2014-11-21 00:05:21

+0

你有該用戶的原始密碼嗎? – 2014-11-21 00:06:56