簡體   English   中英

php密碼_hash和密碼_verify看起來仍然無法正常工作

[英]php password_hash and password_verify looked all over still doesn't work

更新所以這是一個令人尷尬的愚蠢的承認,但問題是我存儲在數據庫中的哈希是一個包含引號的'密碼'的哈希,我寫的查詢沒有問題,問題出在主席和鍵盤。

所以這是一個經常被問到的問題,我已經遍布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數據庫中使用本地創建的副本,它就會失敗。

有任何想法嗎?

存儲哈希

您是否檢查過agent_password正在存儲由以下內容生成的哈希:

password_hash( $password, PASSWORD_DEFAULT );

檢查PDO標准

可能沒有效果,但值得遵循bindParam的不同實現的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存儲的agent_password實際上並不是用password_hash進行哈希處理的password_hash

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM