2013-02-26 53 views
2

我有下面的代碼片段返回false:`password_verify`呼籲正確的密碼

// bcrypt hash of 'password' 
$hash = '$2y$10$4u0cQ.WEnwHDo.C5Nl1vm.shKA0beQ32wqzphSfzklAq9OcDM2nLu'; 
if(password_verify('password', $hash)) { 
    print_r('woohoo!'); 
} 
else { 
    print_r('fubar'); 
} 

在一臺服務器它的正常工作(!哇噢),在另一這是行不通的。 I've just put it up on codepad.org並且它也失敗了。

的問題是(如可以看到,鍵盤頁上),其通過crypt計算的散列是長度13,而不是所要求的60

我使用ircmaxel's password_compat library在github實施PHP 5.5只password_verify功能。

+0

不同的系統安裝了不同的加密算法,所以他們可能會使用不同的算法。如果您沒有指定可能發生的意外事件。在解密或比較之前,您必須首先檢查使用了哪種類型的加密。 – arkascha 2013-02-26 13:40:37

+0

你使用什麼PHP版本? (我假設爲5.3或5.4,因爲lib只適用於那些版本,但是你能指定你正在測試的每臺機器上的確切版本嗎?) – SDC 2013-02-26 13:42:36

+0

它在5.3.14上工作,而不是在5.2.17上工作 – Matthew 2013-02-26 14:08:04

回答

2

看來您正在PHP版本小於5.3.7的腳本上運行腳本,因此算法'2y'尚未知道。

如果可能,我會考慮在此服務器上進行PHP升級,'2y'參數解決了unicode輸入字符串的問題。

如果這不是一個選項,那麼您可以替換兼容包中的算法。某處約49行,你會發現...

$hash_format = sprintf("$2y$%02d$", $cost); 

...將其更改爲前者BCrypt常量 '2A' ......

$hash_format = sprintf("$2a$%02d$", $cost); 

...這當然不是最佳的,但它是在早期版本中可以做的最好的。

新生成的密碼散列現在將以'$2a$10$...'開頭,並且使用此散列值進行驗證應該適用於每個系統。

+0

感謝你們,不幸的是,它不工作的服務器根本沒有bcrypt,因爲它運行的是PHP 5.2.17,並且只有5.3版本纔開始有自己的bcrypt實現。 – Matthew 2013-02-26 14:22:42

+0

您是否嘗試過利用http://phpseclib.sourceforge.net/ – 2013-02-26 14:31:50

+0

@Matt - 是的,那麼您應該查看[phpass](http://www.openwall.com/phpass/)庫,他們聲稱與PHP 3及更高版本一起工作,儘管他們可能會回退到不同的東西。 [Suhoshin-Pack](http://www.hardened-php.net/)也應該添加一個BCrypt的實現。當然,更新服務器將是一件好事。 – martinstoeckli 2013-02-26 14:40:52