2012-04-23 65 views
11

我目前正在實現一個登錄系統。我想將密碼和salt存儲在數據庫中。現在我發現有一個hash()和一個crypt()函數似乎也這樣做(對SHA512有效)。hash()與crypt()函數的比較

hash()更新,似乎支持更多的哈希alogrithms比crypt()。或者我應該知道/關心其他任何差異?

編輯:

function generatePasswordHash($password){ 
    $salt = base64_encode(mcrypt_create_iv(8)); 
    $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

    return $calculatedPasswordHash; 
} 

結果看起來像$1$Qh6ByGJ9$zLn3yq62egvmc9D7SzA2u.

這裏我的密碼檢測功能:

function checkLoginData($username, $password){ 
    global $db; 

    $sql = "SELECT * FROM users WHERE username = :username"; 
    $result = $db->ExecuteQuery($sql, array("username"=>$username)); 

    if(!empty($result)){ 
     $result = $result[0]; 
     $savedPasswordHash = $result['password']; 
     $splitted = explode("$", $savedPasswordHash); 
     $salt = $splitted[2]; 
     $calculatedPasswordHash = crypt($password, '$1$' . $salt . '$'); 

     if($savedPasswordHash === $calculatedPasswordHash){ 
      return true; 
     } 
    } 

    return false; 
} 
+0

@CodeInChaos:從數據庫中存儲和訪問密碼散列。兩者都可以採用salt(通過串聯將salt添加到'hash()'的'$ data'參數)。 – testing 2012-04-23 13:30:39

+1

在許多情況下,只將鹽與數據串聯起來是不安全的。不要這樣做,除非你真的知道你在做什麼。它也是*快*,你希望它變得*慢*。 – CodesInChaos 2012-04-23 13:33:46

+1

新代碼加密密碼,而不是散列它。即其平凡可逆。 – CodesInChaos 2012-04-23 17:52:03

回答

15

使用hash哈希計算,例如完整性檢查。它直接使用指定的哈希算法。

crypt是一個特殊功能的功能。它用於密碼散列和密鑰派生。你需要傳遞一個salt,這間接決定了所使用的哈希方案。即使你選擇CRYPT_SHA512這不是簡單的SHA512。這是一個使用SHA512作爲構建塊的重要派生函數。特別是這種方案故意緩慢(蠻力蠻力攻擊),並以安全的方式組合鹽和密碼。

對於日誌系統中的密碼散列,crypt顯然是正確的選擇。

+0

你喜歡用哪種函數來存儲/檢索密碼哈希值? – testing 2012-04-23 13:33:20

+2

''crypt'' CRYPT_BLOWFISH'和高質量鹽,來自加密PRNG,如'mcrypt_create_iv'應該沒問題。這需要php 5.3。但是因爲我不是PHP程序員,所以我沒有看到細節。 – CodesInChaos 2012-04-23 13:43:06

+0

我發現webspace只提供'標準DES'和'MD5'。我會看看'mcrypt'庫... – testing 2012-04-23 14:20:55