2012-04-05 189 views
9

我正在使用MD5(無鹽)散列用戶密碼的系統上工作。我想使用SHA-512和鹽更安全地存儲密碼。使用SHA-512和salt來散列MD5散列密碼?

雖然這很容易實現未來的密碼,但我還想改造現有的MD5哈希密碼,最好不要強迫所有用戶更改其密碼。我的想法是隻使用SHA-512和適當的鹽來散列現有的MD5散列。然後,我可以在數據庫中設置一些標誌,指明哪些密碼是從純文本進行散列的,哪些是從MD5哈希散列的。或者我可以在驗證用戶時嘗試這兩種方法。甚至可以用MD5和SHA-512/salt對新密碼進行哈希處理,這樣就可以將它們視爲舊密碼。

以編程方式,我不認爲這會是一個問題,但我不太瞭解加密/散列,以便知道我是否以任何方式危害散列的質量,方法是應用SHA-512/salt散列到已經被MD5散列的密碼。我的第一個直覺是,如果有的話,它會更強大,一個非常輕鬆的關鍵。我的第二個直覺是我並不真正知道自己在說什麼,所以我最好得到建議。有什麼想法嗎?

+0

與MD5相比,SHA-512只能提供很小的改進(例如:'MD5(salt + password)'實際上等同於'SHA512(salt + password)')。 MD5和SHA系列之類的通用散列函數不是用來存儲密碼的。使用bcrypt。 – NullUserException 2012-10-30 21:55:53

+0

非常真實。我其實打算做關鍵的延伸,但沒有在我的問題中說清楚。我最終使用PBKDF2而不是天真地實現我自己的密鑰伸展算法。 – 2012-10-31 13:00:14

回答

6

帶有密碼原語的函數組合是危險的,如果可以避免的話不應該這樣做。針對您的問題類型的常見解決方案是在遷移期間保留兩個哈希值,儘可能使用新的哈希值並透明地升級舊密碼(當您檢查密碼並匹配時,使用新算法重新哈希並存儲它)

如果你有一個基於挑戰 - 響應的方案,你不能看到明文密碼,但由於你看起來有一個不會改變的存儲鹽,我假設你的應用程序做了散列。

+0

這是一個很好的答案。我之前正在實施這種類型的解決方案,這是一個很好的方法。 – jeffsix 2012-04-05 16:50:05

+0

感謝您在用戶登錄時進行透明刷新的建議!您是否有任何鏈接可以解釋爲什麼將SHA-512散列應用於MD5散列值比將SHA-512散列應用於純文本密碼更安全?我很想知道爲什麼... – 2012-04-05 17:36:07

+1

@JeremiahOrr:對於您的具體應用,正確使用足夠長的不可預知的鹽將在安全性方面比改變哈希方案做得更多。正如j13r所解釋的那樣,在MD5上應用SHA不會擴大可能哈希的空間,因爲它們受到MD5的可能結果的限制。另外,使用專門針對密碼進行優化的單向函數會更好,例如[PBKDF2](http://en.wikipedia.org/wiki/PBKDF2)。 – mensi 2012-04-06 22:49:05

1

相信你的第二本能。使用專門用於散列密碼的現有庫,而不是嘗試自己製作密碼。

大概用MD5來散列你的新密碼,然後用你的密碼哈希庫對MD5進行散列。這樣,您可以保持與舊密碼的向後兼容性。

I.e. password_hash(所有舊的,md5'd密碼)和password_hash(MD5(新口令))

(警告:我不是一個加密專家)

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

+0

呵呵,我不打算製作我自己的哈希庫,我只需要知道如何處理現有的MD5哈希密碼! – 2012-04-05 12:15:25

+0

我不是密碼學專家,但我只是在現有的MD5密碼上運行密碼散列函數。對於新密碼,您首先要執行舊的MD5算法,然後將其提供給適當的密碼散列函數。 這個,或者你可以以某種方式標記密碼是否在數據庫中使用舊的或新的算法(或者無論你是否存儲它)。 – tangrs 2012-04-05 12:18:29

+0

@tangrs他原來的密碼也是MD5哈希值,它已經被保護。他想用更安全的鹽切換到SHA-512。爲什麼你會建議他雙重哈希?這仍然不能解決如何區分新舊密碼的問題。而雙重散列是通過默默無聞的安全性,這與安全性一樣好,因爲沒有人知道該怎麼做以及如何維護它。 – Churk 2012-04-05 12:21:07

4

如果用MD5哈希第一,你只會有MD5(128位)的傳播。 SHA512的大部分空間不會被您的密碼覆蓋。所以你沒有利用SHA512,但它不會比MD5差。

如果有人獲得SHA512散列並且不知道鹽(這個你必須以某種方式執行),你將無法查找散列並獲得密碼 - 這是可能的您現在擁有的MD5數據庫。

所以是的,你可以重新刷新現有的MD5密碼。但正如第一段所述,將MD5應用於所有新密碼並將它們散列爲SH512將是一個不好的主意。一個簡單的實現是在散列旁邊的數據庫中有一個布爾型的'salted'字段(但不要把salt放在那裏)。

+0

'但是不要把鹽放在那裏 - 鹽的全部要點是它不必保密,只需將明文放在哈希值旁邊(每個密碼都有獨特的散列!)。另外:基於任何實際的事實或僅僅是一些直覺,是否「用SHA-512散列MD5密碼不會造成任何傷害」?因爲通常順序地應用多個散列會造成更多的傷害。 – Voo 2012-04-05 12:28:53

+0

散列函數的要點是它提供了可變長度字符串和n位數之間的唯一映射。任何好的散列函數都可以避免衝突,事實上,在SHA-512甚至MD5上產生衝突是非常困難的(除非你有任意的長度,而不是在密碼中)。將128位值映射到512位空間是微不足道的(您有2 ^(512-128)個未使用的值)。碰撞(這是傷害)極不可能發生(概率2 ^(128-512))。 – j13r 2012-04-05 12:37:27

0

如果你看看大多數銀行和高安全性的人有密碼更改。他們中的大多數基本上會詢問使用舊加密方法的人創建新密碼。我認爲你首先要爲所有現有的舊MD5密碼用戶設置一個標誌,並通知他們需要創建新密碼並慢慢遷移到新系統。這樣,當你遇到任何問題時系統出現故障時,你不會問這是一個新用戶還是舊用戶。我們是雙重哈希還是單一?不應該比較兩個散列作爲可能的答案,因爲如果MD5('abc')=> 123,SHA('NO')=> 123,那意味着某人可能輸入了錯誤的密碼但仍然進入。