2011-01-30 110 views
3

我一直在尋找PHP's crypt function和幾個questions Stackoverflow,我想弄清楚鹽漬和哈希密碼。使用crypt(),我的應用程序如何驗證隨機生成鹽的密碼?

我發現這個PHP社區頁面上:從另一個question

<?php 
// Slightly modified example from PHP community page 

$password = trim(mysql_prep($_POST['password'])); 

// Get the hash, letting the salt be automatically generated 
$hashed_password = crypt($password); 
?> 

下面是摘錄:

<?php 
function md5crypt($password){ 
    // create a salt that ensures crypt creates an md5 hash 
    $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
        .'abcdefghijklmnopqrstuvwxyz/'; 
    $salt='$1$'; 
    for($i=0; $i<9; $i++){ 
     $salt.=$base64_alphabet[rand(0,63)]; 
    } 
    // return the crypt md5 password 
    return crypt($password,$salt.'$'); 
} 
?> 

如何類似的東西比較

然而, PHP crypt()函數可以使用 到的各種不同的哈希計算哈希。當你用「$ 1 $」加 鹽時,你會得到一個帶有 MD5的散列。當你用$ 2 $作爲前綴時,你會得到 一個帶有河豚的隱窩,這是更安全的 。

「$ 1 $」加在輸出前面,因此 可以驗證散列。如果它不包含 ,那麼從存儲的散列中就不會知道哪個 算法應該被使用!這個 信息將不得不在其他地方存儲 。爲了節省您的這個麻煩 PHP在散列 輸出中包含算法。

我的頭在旋轉關於散列,加密和鹽有點......但事實真是樹樁我的一部分,我怎麼比較用戶輸入的password針對salted hashed password,如果鹽時隨機生成用戶創建......而不是存儲 - 最重要的是,如果你必須指定正確的前綴以便能夠在用戶返回時再次驗證密碼,那麼使用crypt()與自動salt有什麼關係?

+2

請勿使用ASCII鹽。 – SLaks 2011-01-30 23:30:52

+4

請勿使用MD5。 – SLaks 2011-01-30 23:31:13

回答

5

您需要將salt存儲到用戶。

鹽的目的是爲了確保具有相同密碼的兩個用戶獲得不同的哈希值。
這可以防止彩虹表攻擊。

編輯:你的鹽應該包含(加密保護)隨機字節
現在,你只限制它只包含字母和數字

+0

我如何將它與除Cookie以外的用戶一起存儲?如果Cookie被擦除會發生什麼......他們只是無法驗證?對於noob問題也很抱歉,但什麼是ASCII ......或者更好呢,ASCII的替代方法是什麼? – jlmakes 2011-01-30 23:35:04

1

想法是爲每個用戶/密碼都有一個隨機鹽。

添加一個鹽會讓猜測您的密碼更加困難,但是對每個帳戶使用隨機鹽將會增加安全性,因爲它會減少攻擊者猜測任何其他密碼的方式,不安全的密碼和/或用戶名,反向工程來猜測密碼會很容易。

它對跨系統安全性有很大影響,因爲人們傾向於在大多數站點上使用用戶名/密碼。

使用隨機鹽使得字典中的攻擊幾乎不可能,因爲您需要計算每個可能的猜測任何密碼的鹽。

1

如果您在/ etc/shadow文件的格式仔細觀察,你會看到在第二場的命名(與:劃定字段):

username:${enctype}${salt}$HoPeFuLlYVerYloNGpassWOrDhAsh: ... ... ... 

鹽實際存儲的密碼。 {enctype}是正在使用的加密類型,{salt}是鹽。由於您的知道加密類型和salt,因此您可以自然地使用它們提供的密碼重新生成哈希(從而驗證用戶)。

{enctype}值的地穴一個方便的表(供參考之用):

  ID | Method 
      ───────────────────────────────────────────────────────── 
      1 | MD5 
      2a | Blowfish (not in mainline glibc; added in some 
       | Linux distributions) 

      5 | SHA-256 (since glibc 2.7) 
      6 | SHA-512 (since glibc 2.7) 

最後,how PHP lets you use them

所以,如果你看到一個字符串,如:

root:$6$foobar$JKLsdiuoilI/KSJHDKUyjh/SHDKJyUYW(....) 

你知道你正在處理SHA-512和鹽是「foobar的」(和可能,該帳戶是foobar的呢!)。

這是一個鹽如何被存儲並與哈希相關聯的例子。正如SLaks所說,不要將鹽限制在ASCII中。至少你應該從PRNG或HRNG獲取字節,回落到時間()只有沒有RNG可用時。

0

不,你做錯了。使用solardesigner的PHPASS爲了做散列和驗證。最後,永遠不要使用你自己的臨時計劃,這樣做會造成麻煩。