2012-06-05 66 views
1

我一直在嘗試通過mysql數據庫來了解用戶表中存儲的哈希和鹽。我通過存儲他們,但似乎無法包裝我的頭周圍如何驗證用戶登錄時。
我已經瀏覽並看到有關存儲鹽和散列分開和一起。我生產的鹽是隨機的。使用隨機鹽驗證密碼

任何想法?
我發佈了我的代碼。

<?php 
$password = 'passwordwhatever'; 

//generate the salt 
function gen_salt() { 
    $salt = uniqid(mt_rand(), true) . sha1(uniqid(mt_rand(), true)); 
    $salt = crypt('sha512', $salt); 
    return $salt; 
} 

//generate the hash 
function gen_hash($salt, $password) { 
    $hash = $salt . $password; 
    for($i = 0; $i < 100000; $i++) { 
     $hash = crypt('sha512', $hash); 
    } 

    $hash = $salt . $hash; 
    return $hash; 
} 

$password = gen_hash(gen_salt(), $password); 
echo $password; 

?> 
+0

儘管如此,鹽的生成可以用一種不那麼矯枉過正的方式來完成;只是一個'uniqid(mt_rand(),true)'就足以達到這個目的,並且在其上添加一個'sha512'不會使它變得更隨機;-) –

回答

0

鹽將需要包含在數據庫(或某處)的某個地方。一些選項是將salt附加到散列或存儲爲其自己的字段。我喜歡將它附加到散列。

$password = $salt . '.' . $hash; 

然後,當用戶去登錄,你搶了他的密碼,它分成散列和鹽,並使用你的密碼生成功能(從密碼,而不是一個隨機鹽的鹽),以確定如果它匹配db中的密碼。

list($salt,$hash) = explode('.', $password); 
$check = gen_hash($salt, $input_pass); 
if ($check === $password) 
    // valid 
2

只要你生產相同的鹽,它應該不會太重要。將其存儲在你的數據庫中,只要你可以進入配置。顛倒SHA512散列的努力非常高,除非你是五角大樓,否則沒有人會打擾。關鍵是你希望能夠用相同的鹽重複散列,所以你可以確信輸入是相同的,而不必存儲敏感輸入。如果這是有道理的。

+0

正確的金錢。我要發表評論說,你真的不需要花費很多精力來加密這樣的鹽。最重要的是它是隨機的,而不是它是超安全的。即使有人得到鹽和散列,專門爲該鹽創建彩虹表也不是一個計算實際的工作。我不會放棄它(保留在後端,不要公開地向用戶公開),但是隨機提供一串字母和數字通常足夠安全。 –

+0

幾個方面的說明:1)不要爲每個密碼使用相同的鹽;每個密碼的鹽應該是唯一的。非常獨特;你不必檢查那個不存在或者不存在的東西,只要讓它們足夠長,以至於幾乎沒有重複的機會。 2)通常我使用冒號作爲分隔符來存儲鹽。但是,如果您可能想使用它來散列其他內容,則可以將其存儲在密碼錶的自己的列中。 –

0

也許你應該看看bcryptThis可能會幫助你。我寫了一些tutorials,但他們是在德國。哦,PHP 5.3本地支持bcrypt。