2016-11-13 28 views
5

經過一些故障排除後,我確定當我使用PHP的password_hash函數對密碼進行哈希處理時,加密標識符是$ 2y $。但是,當我使用password_verify函數將存儲的散列密碼與用戶輸入密碼進行比較時,password_verify將不會返回true。如果我使用https://www.bcrypt-generator.com/上的$ 2a $標識符生成一個新密碼,並用它替換存儲的散列密碼,它將返回true。爲什麼php password_verify和password_hash使用不同的加密標識符?

我希望有人能解釋爲什麼password_hash($ password,PASSWORD_DEFAULT)使用$ 2y $和爲什麼password_verify()使用$ 2a $。或者我可能在這裏做錯了任何事情。我在運行PHP Version 7.0.10的WAMP服務器上本地執行此操作。

以下是我遇到問題的代碼示例($ 2y $ identifier不會返回true)。

<?php 
// $hashNotWorking came from password_hash("testing", PASSWORD_DEFAULT)."\n"; 
$hashNotWorking = '$2y$10$DNPos6f7Vo4Z2IrYU./eCObD7BMkwlkK9yiYjb0hvnI14B1dbFHbC'; 

if (password_verify('testing', $hashNotWorking)) { 
echo 'Password is valid!'; 
} else { 
echo 'Invalid password.'; 
} 
?> 

這裏是使用的代碼(由password_hash功能不產生$ 2A $加密)的一個例子。

<?php 
// $hashWorking came from https://www.bcrypt-generator.com/ 
$hashWorking = '$2a$08$uP75n/pDhUZo6qOOM3DuPug5U2fcSXW4f3MUz8p3SlO5yPZ4fLf9O'; 

if (password_verify('testing', $hashWorking)) { 
echo 'Password is valid!'; 
} else { 
echo 'Invalid password.'; 
} 
?> 

在此先感謝您的幫助。

+0

http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php#comment8558243_6337021看到該評論和該頁面上的其他內容。 –

+1

我懷疑你發佈了第一個被正確散列的東西。確保散列期間沒有引入換行符或
;我以前見過這種情況。 –

+0

謝謝弗雷德。我使用的是「\ n」,因爲這就是php.net的例子。我也試過沒有,仍然不能得到真實的。我正在閱讀你現在發佈的鏈接。試圖做更多的研究。 –

回答

4

我懷疑可能在原始散列和/或<br>中引入了空白,或者某些可能已經由用戶引入。

我以前經常見過這種情況。

如果是這樣的話,trim()吧。

根據我在評論中提到的內容創建一個新的散列,它將起作用。

echo $var = password_hash("testing", PASSWORD_DEFAULT)."\n"; 

然後粘貼它代替你目前的散列。

相關問題