2009-07-29 114 views
12

我有一個哈希密碼的數據庫,它們在哈希前沒有添加鹽。我想爲新密碼添加salt。顯然我不能重新打散現有的。你會如何添加鹽到你現有的密碼哈希?

你將如何遷移到一個新的散列系統?

+0

你實際上是哈希密碼,還是更復雜的東西?由於編碼錯誤,我使用了類似的工具 - 但原始代碼有效地散列了「1」+ loginname +「」+密碼 - 這足以使彩虹表變得不可行(尤其是因爲登錄名不是用戶自定義的)選擇)。 – 2009-07-29 17:42:26

+0

我直接將密碼散列。看起來你已經添加了鹽。你的方式似乎很好,因爲除了鹽之外,相同的密碼將不會具有相同的散列,因爲您正在添加登錄名。 – 2009-07-29 17:46:38

回答

31

當然可以。只需將鹽添加到現有散列並再次散列即可。當然,這將需要任何未來的登錄經歷相同的過程,這意味着需要調用兩個哈希函數,但無論如何,許多合法模式都會這樣做,因此它不會像您想象的那麼糟糕。

醃製密碼是爲了防禦彩虹桌。在這種情況下,鹽不需要是祕密。

http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables

實際上,你可以看到這篇文章

hash = MD5 (MD5 (password) . salt) 

這是你將使用完全相同的方法Standard。 (除不同的散列函數。)

+0

+1 - 我喜歡這個比我想象的更好 – 2009-07-29 17:07:37

+0

有趣的想法。不過,你確定它不會妨礙安全嗎?特別是這樣,一個人在第二次散列之後獲得字符串將會獲得大量關於前一步驟的信息(例如恆定長度),這可能允許他幫助他找到鹽。 – 2009-07-29 17:09:11

+3

鹽不是祕密。實際上,您需要將它們(以純文本形式)與每個用戶一起保存。 – 2009-07-29 17:10:27

2

你可以添加一個列,其由表示用戶是否具有(無鹽)的標誌或一個(鹽)散列的。

一個好主意是,在這一點上,以強制所有用戶在註冊時更改他們的密碼,這樣你就可以擺脫該列的最後。

14

作爲速戰速決,你可以在數據庫中創建一個鹽柱,當用戶登錄正確的匹配舊散列,然後你可以使用該密碼,他們與鹽進入,並創建一個新的哈希值。

0

some ways here可能適合你。請記住,您添加到現有哈希中的任何常量模式都是無用的(該鏈接上的其中一個技巧就是暗示類似的東西)。應該沒有可用於分離鹽的可識別模式。

當然,最好的方法是遷移到鹽味散列表。

0

與類型的創建在你指定的數據庫「鹹魚」的新領域真/假(或其他等值是在你的DBMS)。將現有散列的所有值設置爲false。每當添加一個新的鹽漬散列時,將「鹹」字段設置爲true。

然後,所有你需要做的是處理兩類散列在不同的代碼。

這是比特定的更通用的解決方案,但它應該可以解決您的問題。

0

如果要存儲的哈希裏面的鹽,它應該是相當簡單的,以確定是否鹽是通過檢查散列的長度包括在內。如果沒有鹽,只需輸入密碼,如果有鹽,則輸入密碼+鹽。

你不應該在你的數據庫中需要一個布爾列。

0

我存儲我的鹽,最好的辦法是,我嵌入我剛纔所創建的密碼哈希+鹽中的鹽值。我不會將salt字符串附加到散列的開始或結尾,我會將salt嵌入到散列中。

1

我處理了涉及多個散列技術的類似問題。我使用了在數據庫中編碼散列方法類型的方法(即'alpha','beta','gamma','delta')。我用適當的級別標記了所有當前的哈希值。隨着用戶登錄,我驗證了他們的密碼並使用更新的方法重新對他們進行了散列處理。我們的密碼在90天后過期,所以只需要等3個月,直到所有使用舊方法的密碼都可以重置爲止。