2010-10-22 51 views
5

我認爲這可能是一個愚蠢的問題,但我對於我應該在這裏做的最好的事情感到非常困惑。Salt的密碼哈希值應該是「哈希」嗎?

當醃製密碼哈希時,該鹽是否應該散列或保留爲明文?

注意:我在散列SHA-256和鹽密碼是唯一的密碼將會被存儲在一個時間一個預定義的字符串。

TIA

Chris(Shamballa)。

回答

15

沒關係。

鹽的目的是防止預計算攻擊。

無論採用哪種方法,散列鹽或單獨使用鹽都會導致每次都會以鹽形式添加相同的數據。如果你把鹽加了鹽,你所做的只是改變鹽。通過首先對它進行哈希處理,將其轉換爲不同的字符串,然後將其用作鹽。沒有理由這樣做,但如果你這樣做,它不會做任何錯誤。

你只需要保持一致,並使用同樣的方法,每次否則你會最終有一個不同的密碼哈希值。

+0

我仍然強烈建議不要使用靜態鹽。即使您一次只存儲一個密碼,它可能會破壞鹽的目的。 – Slartibartfast 2010-10-25 04:14:24

+0

我同意,不同的鹽可能應該用於每個密碼,你只需要使用相同的鹽每次給定用戶的密碼。但是這裏的要點是鹽只是額外添加的東西。在使用鹽之前對鹽進行散佈並不會改變這一點,它只是使它成爲一種額外的東西。 – 2010-10-25 05:12:34

+0

它的語義,但你不能散列鹽。必須以明文形式檢索鹽才能使用。由於散列是一種方式,所以你不能散列你的鹽。如果你想使用散列算法來生成你的salt,那很好,但是結果散列值變成新的salt,你仍然必須能夠以明文形式檢索它。如果你真的打了你的鹽,你已經失去了你的帳戶。 – 2011-01-24 19:45:15

1

鹽不應該被散列,因爲在散列之前需要將原始值與密碼結合使用。

7

由於散列是一種方式,所以不得散列鹽。您需要鹽,以便在散列之前將其添加到密碼。你可以加密它,但沒有必要。

鹽的關鍵是每個密碼都應該有自己的鹽。理想情況下,每種鹽應該是獨一無二的,但隨機也是很好的。因此,鹽應足夠長,以使其對每個密碼都是唯一的。

如果所有的鹽是一樣的,這是明顯的裂解爐(誰可以看到你的哈希值),佔具有相同的密碼。散列值將是相同的。這意味着如果他們破解一個密碼,他們會獲得多個帳戶,而不需要額外的工作。破解者甚至可能以這些賬戶爲目標。

你應該假設黑客將獲得兩鹽和散列值,所以該散列算法必須是安全的。

任何鹽都可以防止使用現有的預先計算的彩虹表來破解你的散列值,併爲每個帳戶有一個獨特的鹽,消除了你的餅乾使用你的鹽預先計算自己的彩虹桌的願望。

+1

@aaaa bbbb,如果您在存儲它之前對它進行哈希處理,則無法檢索密碼。如果你在你的代鹽中使用哈希算法,那很好。 salt是在哈希值之前添加到明文中的部分。在此之前它不是鹽。 – 2010-11-11 15:24:20

0

不,你不得散列鹽。 salt的文本是明文的,需要您重新計算密碼並使用散列密碼文件中存儲的密碼進行檢查。

但是如果你需要一個強大的醃製過程就可以計算以這種方式您的鹽漬密碼:

SaltedHashedPwd = H(H(H(H(... H(PWD-K + SALT-K )+ SALT-K)+ SALT-K).....)+ SALT-K + N

H是散列函數 SALT-k被你作爲鹽 PWD-k上使用的k隨機串是第k密碼 (每密碼具有不同的鹽) Ñ是構成H函數的迭代次數

在PKCS#5標準中,它使用N = 1000!

在這種方式下,字典攻擊是不可能的,因爲對於字典中的每個字詞和每個SALT到密碼文件中,攻擊者都需要計算哈希。過於膨脹的時間!

我認爲,N = 100應該夠你使用:-)

+1

錯誤。 「沒關係」是正確的答案。你可以散列鹽,這實際上給你一個新的鹽。你所要做的就是保持一致。 – 2010-10-22 21:48:57

+0

看看我寫的更好。您可以將PWD和SALT連接起來,但最後必須連接SALT的清除形式。否則,您無法在驗證階段重新計算散列值。 – robob 2010-10-23 07:29:10

0

隨着鹽需要隨着散列被保存(或至少必須與哈希一起檢索),攻擊者可以可能會同時獲得salt和哈希密碼。在我的一些應用程序中,我將加密的加密的存儲在數據庫中(只有應用程序已知密鑰)。我的推理是,將未加密的salt與散列密碼一起存儲會使得破解密碼變得更容易,因爲能夠檢索密碼錶的黑客(並且將知道或假定關於散列算法)將能夠通過對字典中的每個單詞進行散列,然後用他也可以訪問的鹽進行鹽析來找到衆所周知的單詞(字典攻擊)的哈希之間的匹配。如果鹽會被加密,那麼這種攻擊是不可能的,除非他也可以訪問應用程序已知的加密密鑰。

(如果有人看到了這個邏輯故障,請評論。)