2016-11-21 155 views
1

我正在使用password_hash加密用於插入數據庫的密碼。這是工作,但是當我用password_verify來驗證它總是返回false,即使加密值相同(檢查數據庫的值)password_verify未返回true

這裏是我的代碼:

if ($_POST['submit']) { 
    $dbh = new PDO("mysql:dbname=pass;host=localhost", "root", ""); 

    $select = $dbh->query("SELECT username, password FROM passwords WHERE username = " . $dbh->quote($_POST['username'])); 

    $fetch = $select->fetch(PDO::FETCH_ASSOC); 

    if (password_verify($fetch['password'], password_hash($_POST['password'], PASSWORD_BCRYPT))) { 
     echo 'Welcome! ' . $fetch['username'] . " your password is " . $fetch['password']; 
    } else { 
     echo "no"; 
    } 
} 

加密密碼數據庫是

$ 2Y $ 10 $ dMXgvPo5j9.8gaSqgtxTSevlFCsJwdSn8vdLbqFirUQcFvzfk0or2

我錯過什麼?我在PHP中使用了不同的哈希函數(hash()),所以我對爲什麼這種方式不起作用感到困惑。插入的密碼通過數據庫加密password_hash($password, PASSWORD_BCRYPT)

任何幫助,將不勝感激。

+0

的語法是'password_verify($非散列,$散列);' - 見[文檔](HTTP ://php.net/manual/en/function.password-verify.php) - 所以對於你的特定代碼,它會是'password_verify($ _ POST ['password'],$ fetch ['password']); ' – Qirel

+0

$ _POST ['pa ssword']是非哈希的。 – user2101411

+0

該手冊說的字符串密碼,int算法的password_hash()所以你想說什麼? – user2101411

回答

1

驗證時,您不需要重新密碼。

password_verify($_POST['password'], $fetch['password']); 

此外,你有他們在錯誤的順序。

+0

謝謝,沒有看到。 – user2101411

+0

標記爲已答覆,一切都很好。 :) –

+0

必須等待9分鐘,但我會標記它時間到了 – user2101411

1

password_verify()的語法,從文檔

布爾password_verify(字符串$的密碼,串$哈希)

這意味着,只有2個參數,而你是在錯誤的順序。除此之外,$password字符串是非哈希變量。

只需將其改變爲

password_verify($_POST['password'], $fetch['password']); 

參考

+0

謝謝,我讓他們錯了,對不起。 – user2101411

+0

@ user2101411已經在評論中提到了你,但我想我也會發佈一個答案;-) *乾杯* – Qirel

+0

對不起,我沒有看到它在錯誤的順序,我的錯誤,但感謝指出它出:) – user2101411