2013-07-18 108 views
0

我發現這個例子如何散列和檢查密碼與PHP。這是安全的嗎?這是一個很好的例子來模仿?PHP:這個密碼加密是否安全?

public function hashPassword($mail, $password, $salt, $rounds='08') 
{ 
    $length = strlen($password) * 4; 
    $data = str_pad($password, $length, sha1($mail), STR_PAD_BOTH); 
    $string = hash_hmac('whirlpool', $data, SERVER_KEY, true); 

    return crypt($string, '$2a$' . $rounds . '$' . $salt); 
} 

public static function checkPassword($mail, $password, $stored) 
{ 
    $length = strlen($password) * 4; 
    $data = str_pad($password, $length, sha1($mail), STR_PAD_BOTH); 
    $string = hash_hmac ('whirlpool', $data, SERVER_KEY, true); 

    return (crypt($string, substr($stored, 0, 30)) === $stored); 
} 
+0

哦,請不要稱之爲解密密碼,你會開始「憤怒」。無論如何,爲什麼使用比bcrypt/scrypt/ppbkdf2還要多的東西呢? – JimL

+0

好吧,你是對的。這不是一個解密功能。 – Pascal

+0

其實它也不是加密的,漩渦是一個哈希算法:P現在我只是覺得自己像一個混蛋o我還是推薦一個可靠的,經過驗證的例程,比如bcrypt或者pbkdf2 – JimL

回答

2

散列算法看起來比其實沒什麼問題其他您所使用$2a$代替$2y$。從crypt() man page

開發商只針對PHP 5.3.7後來由於成本參數是非常優先應該用 「$ 2Y $」 到 「$ 2A $」

此外,使用08除非你使用的是非常舊的硬件,否則會變弱您希望儘可能長時間地散列,而不會給用戶造成不便。通常250毫秒是可以接受的。在我的臺式電腦(這不是現代的),這相當於11,所以對於一個體面的服務器,你可能至少需要這麼多。嘗試使用該參數,直到獲得一個需要花費這麼長時間的數字來計算/驗證散列並使用它。

另一個相當大的問題是如何生成鹽,但由於我們沒有看到你是如何做到這一點的,所以沒有太多可以批評的東西。

儘管如此,迄今爲止最好的做法是忘記製作一個家庭釀造密碼散列算法,而是使用內置於PHP的password_hash()函數。 (對於PHP < 5.5,您可以從github下載兼容包)。