2012-02-23 144 views
21

我開始一個網站,我正在嘗試決定如何加密用戶密碼以將它們存儲在SQL數據庫中。用隨機鹽改善密碼哈希

我意識到使用簡單的md5(密碼)是非常不安全的。我正在考慮使用sha512(password.salt),我一直在研究生成有用鹽的最佳方法。 我閱讀了大量文章,指出鹽應儘可能隨機添加到散列熵,它看起來像個好主意。但是:

  • 需要一起存儲在隨機鹽與哈希
  • 給攻擊者以某種方式取得了您的哈希密碼(並試圖扭轉哈希爲純文本),這意味着他可能傾銷您的數據庫,然後獲得訪問您的隨機鹽

是不是很明顯,在數據庫中散列旁邊的怪異看起來的價值是鹽?如果攻擊者可以隨同哈希值一起訪問salt,那麼更安全嗎?

任何人都有該領域的專業知識?謝謝!

+0

不要忘記,畢竟這仍然需要好的密碼。 – 2012-02-23 20:41:08

+2

@PeeHaa:攻擊者不需要每個鹽值的彩虹表嗎? – 2012-02-23 21:01:19

+4

鹽是有防止彩虹表攻擊。現在攻擊者不得不爲每條記錄創建一個彩虹表,而不是每個記錄的一個。 – PeeHaa 2012-02-23 21:21:37

回答

40

攻擊者是「允許」瞭解鹽 - 您的安全性必須設計成即使知道鹽仍然安全。

鹽是做什麼的?

使用預先計算的「彩虹表」防止鹽暴力攻擊暴力攻擊。
鹽使攻擊者的暴力成本(時間/內存)更加昂貴。
計算這樣的表格非常昂貴,通常只有當它可以用於多個攻擊/密碼時才能完成。
如果您對所有密碼使用相同的鹽,攻擊者可能會預先計算這樣一個表,然後將您的密碼暴力破解爲明文...
只要您爲每個密碼生成一個新的(最好的密碼強壯的)隨機鹽你想存儲密碼的密碼沒有問題。

如果您想進一步加強安全
你可以計算哈希幾次了(哈希散列等等) - 這不會花費你很多,但它使蠻力攻擊/計算「彩虹表」,甚至更貴......請不發明自己 - 有可靠的標準方法來做到這一點,例如參見http://en.wikipedia.org/wiki/PBKDF2http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

注:

使用這樣的機制這幾天mandatrory因爲「CPU時間」(可用於彩虹表/強力等攻擊)正在得到越來越廣泛的應用(例如,參見亞馬遜的雲服務是全球最快的超級計算機前50名,並且可以任何人使用相對較少的數量)!

+9

或甚至更好的GPU時間 – PeeHaa 2012-02-23 20:32:35

+0

真棒回答謝謝! – Tchoupi 2012-02-23 20:38:49

15

給攻擊者以某種方式取得了您的散列密碼 (並試圖扭轉哈希爲純文本),這意味着他 可能拋棄你的數據庫,然後得到了您的隨機鹽接入 也

醃製的整點是打敗 「彩虹表」:

http://en.wikipedia.org/wiki/Rainbow_table

見爲什麼足夠長的鹽擊敗「防禦彩虹桌」下的任何彩虹桌。

這樣更安全嗎?

它曾經更安全,因爲它迫使攻擊者嘗試一種非常昂貴的蠻力方法,而不是在預先計算的彩虹表中查看即時消息。如果你有一個64位的鹽,攻擊者需要有2^64個預先計算的彩虹表,而不是一個......換句話說:它使得彩虹桌無用。

但是請注意,現代GPU可以每秒破解數十億密碼,這使得攻擊者無法存儲巨大的彩虹表(而不是存儲數十億次散列,只需在幾秒鐘內計算出來)就毫無意義。

現在,您想使用像PBKDF2或scrypt之類的東西存儲您的「密碼」。

-1

這裏有一個關於密碼的好文章:對鹽的討論http://www.javacodegeeks.com/2012/02/introduction-to-strong-cryptography-p1.html

見散列算法的部分真實世界的用法,方案1

我強烈建議使用http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html來生成鹽

+2

可能因爲這個問題是關於PHP的,而且你推薦使用Java庫。 – 2012-02-23 21:46:04

+1

而且可能是因爲你的答案容易受到linkrot的影響。您應該在答案中包含與問題相關的文章的確切部分。 – kba 2012-02-24 00:18:03

+1

啊,我以爲當我點擊這個時,我正在看Java標記的問題。這個問題本身從來沒有提到PHP。儘管如此,一個非upvote可能已經足夠了。我爲無禮或積極無益的答案節省下來,但我想這只是我的風格... – 2012-02-24 14:45:13

0

您的散列的強度,鹽漬密碼依靠所有的下列因素:

  • 的哈希算法
  • 隨機性的力量鹽的
  • 密碼的隨機性

您的系統與上述最弱的系統一樣強大。

0

以下問題來自姊妹網站Security StackExchange。他們討論哈希,鹽,PBKDF2,bcrypt,scrypt和其他一些事情。

還有從這裏StackOverflow的一些前面的討論,以及:

Is BCrypt a good hashing algorithm to use in C#? Where can I find it?

在簡短的回答你的問題,鹽是一種保護措施這使得在發生危機時恢復密碼需要很長時間,就像散列一樣。如果攻擊一個密碼,鹽不會有所作爲。如果嘗試使用預先計算的字典或同時測試多個密碼,爲每個條目添加不同的鹽將大大增加所需的工作量,並且通常會使生成合適的彩虹表不可行。