2015-11-25 156 views
0

我測試了PHP的password_verify,驗證不正確。我使用的是centOS和PHP版本5.3.3。我知道5.3.3版本的PHP不提供password_hash函數,所以我已經使用了https://github.com/ircmaxell/password_compatPHP的BCrypt無法驗證密碼

但是,當我驗證它時總是用不同的密碼返回true。我的代碼有bug嗎?

這裏是我的代碼:

$password = 'k32AlGOPqvCzoh*Sp(Hdrr26]M=lQb00R&W=hew|-|([(03vp==A8%m?l=eA2^bs_|\qVV3WZ'; 

    $verify_pw = 'k32AlGOPqvCzoh*Sp(Hdrr26]M=lQb00R&W=hew|-|([(03vp==A8%m?l=eA2^bs_|\qVV3WZasdasdasdasdqweqa13123'; 

    $options = array(
       'cost' => 15 
      ); 

    $hash = password_hash($password, PASSWORD_BCRYPT,$options); 

    var_dump(password_verify($verify_pw ,$hash)); // always true 
+0

我不認爲你會在password_verify()中發現很多隨機數,但如果你真的相信代碼中存在錯誤,那麼你就創建一個[SSCCE](http://sscce.org/)來證明你的斷言並在[github的兼容包](https://github.com/ircmaxell/password_compat/issues)上發佈一個問題,或者關於[bugs.php.net](https://bugs.php)的錯誤報告.net /) –

+0

但它真的發生在我身上,那是我非常難過的。我知道'password_verify()'應該可以正常工作,但仍然無法弄清楚在我的關卡中會發生什麼事情。或者我應該提供更多信息。 –

+0

bcrypt by design * always *給出不同的散列輸出,看看[這個sof問題](http://stackoverflow.com/questions/8467819/bcrypt-generates-different-hashes-for-the-same-input)。或者只是嘗試[這個加密計算器](https://www.dailycred.com/article/bcrypt-calculator)。但是,我想知道您的不同密碼是指不同的純文本還是傳遞到bcrypt並吐出不同輸出的純文本 - 請驗證。另外,請注意您的哈希中的幾個第一個字符,它定義了哈希長度和鹽分,[wiki](https://en.wikipedia.org/wiki/Bcrypt)解釋了這一點。 –

回答

2

問題不在於你的代碼。例如Bcrypt具有來自56個字節的字符串限制,例如, 55個字符

https://www.usenix.org/legacy/events/usenix99/provos/provos_html/node4.html

關鍵參數是一個祕密的加密密鑰,其可以是最多56個字節(包括終止零 字節 用戶選擇的密碼時,關鍵是一個ASCII串)。

所以你的字符串被截斷,這就是爲什麼你password_verify回報八方通true截短字符串相同的原因。

+0

非常感謝您,因此我需要限制用戶字符長度或使用SHA-512隨機發言。我對嗎? –

+0

該算法在內部更好地管理字符,因此您至少可以使用「71」字符。我不知道SHA-512是否有類似的行爲 – ins0

+0

SHA-512應該這樣做,它會對字符串進行摘要。 –