2012-10-05 147 views
1

如果您在散列密碼之前使用鹽,它會使散列更安全。這是有道理的,因爲彩虹表攻擊變得更加困難(不可能?)。多鹽保護密碼

如果您使用多種鹽,該怎麼辦?例如 - 你檢查一天是星期一,還是月,小時等(或某種組合)。然後你有一個存儲字段的數據庫:(userid,hash1,hash2,hash3 ...)。

這會使信息更安全嗎?

實施例:

1)密碼 'PASS' 用戶寄存器。 2)系統(本例中的php)存儲每天(7個密碼)的值(md5($ password。$ this_day))。進入表密碼,列hash_monday,hash_tuesday等 3)用戶登錄,腳本檢查密碼'hash_'。$ this_day匹配輸入內容。

+0

彩虹表攻擊變得更加困難,散列並不能幫助你避免字典攻擊。 – Woot4Moo

回答

6

您的系統將不再安全 - 您最終得到幾個單鹽數據庫而不是一個。原則上它可能會更不安全,因爲您可以幫助攻擊者向同一個字符串提供7個哈希以供選擇,他只需要猜測一個哈希。這些相同明文的多個哈希也可能會導致用於密碼的加密密碼強度的影響(不確定在那個密碼上,它將取決於所使用的算法)。

4

也許你應該看看這個小article。你的方法有幾個錯誤。

  1. 鹽不能防止字典的攻擊。如果正確使用,它可以防止彩虹桌。
  2. 爲每個密碼使用獨特的鹽。鹽應該是一個隨機值,並非來自已知信息。它必須與密碼一起存儲。
  3. 不使用MD5散列密碼。 Md5被認爲是壞的,而且散列密碼太快了。使用現成的GPU,您可以計算每秒8 Giga MD5散列(in 2012)。這使得有可能在不到0.1毫秒的時間內用一個大約500000個單詞強制整個英語詞典!
  4. 使用Bcrypt用於散列密碼。建議使用像phpass這樣的完善庫,如果您想了解如何實現它,可以閱讀上面的文章。

如果你想一個機密添加到您的散列函數(如隱藏式鍵,或隱藏功能),你可以添加辣椒的密碼。辣椒應該不是被存儲在數據庫中,應該保密。只要攻擊者只能訪問你的密碼散列(SQL-Injection),而不是祕密的服務器,胡椒就可以防止字典攻擊。

+0

非常好的信息... – Shurmajee

+0

我仍然沒有在辣椒上賣掉,可以節省你的字典攻擊 – Woot4Moo

+0

@ Woot4Moo - 你是對的,它只保護某些類型的攻擊。 – martinstoeckli

0

我不相信在這種情況下多個哈希會幫助你,主要是因爲當有人妥協你的數據庫時,他們會注意到你有7種不同的鹽來反對,並可能會作出有根據的猜測,他們是基於天一週中的。 MD5沒有什麼根本性的錯誤,因爲很多人喜歡跳上這個潮流。說MD5是破碎散列的人的類型在散列函數和加密散列函數之間存在根本的誤解,我會建議忽略它們。如果您需要密碼散列函數,請使用SHA-2(或來自該系列或更高級別的產品)。

您需要對用戶輸入進行限制,正如您所知,通常建議使用隨機值,但它也可以是存儲在單獨應用程序空間(數據庫外部)的值,您只需保護該信息也是如此。我強烈建議使密碼散列函數對於任何輸入都需要數千次迭代。因爲這會減慢數據庫匹配哈希的自動化過程。

如果您的用戶使用容易猜到的密碼,詞典攻擊將每天擊敗您,無法防範愚蠢。

+0

不確定你的意思是散列與加密哈希,用於存儲密碼,你需要一個加密哈希。如果有一種已知的獲取碰撞的方法,那麼散列被認爲是破壞的,這比暴力破解更快。正如你正確指出的那樣,MD5當然太快了。鹽不是祕密,沒有必要隱藏它,如果你想添加一個祕密,你添加一個胡椒。我不會混合鹽和胡椒粉,因爲它們有不同的目的。在某些情況下,胡椒**可以防止弱密碼(SQL注入)。 – martinstoeckli

+0

@martinstoeckli你有沒有一份研究報告指出胡椒可以抵禦弱密碼?基於我對胡椒的理解,它使零感。有兩類哈希,正常哈希(MD5)和加密哈希(SHA)。 MD5沒有任何問題,碰撞的「緩解」不如厄運者說的那麼高。如果我存儲密碼,我會推薦一個加密哈希,但從根本上說,MD5很好,而且世界上所有的哈希都不能爲您節省密碼。 – Woot4Moo

+0

如果攻擊者不**具有控制服務器(並因此具有祕密的代碼),則胡椒只能防止字典攻擊。如果攻擊者使用SQLInjection成功,通常情況下就是這種情況。你把胡椒添加到(弱)密碼中,所以不是「12345」,而是實際上哈希「12345ai8-9?uz3dWe」,你會發現沒有字典。 – martinstoeckli