2017-04-02 110 views
2

我正在使用KeyDerivation.Pbkdf2生成密碼哈希,我想知道一般建議是關於鹽長度與Pbkdf2輸出的總體哈希長度相比。鹽長與總哈希長度比

在下面的實現中,我使用HMACSHA512,並且假設salt是512位,並且hashBitLength也是512位。

KeyDerivation.Pbkdf2(password, salt, KeyDerivationPrf.HMACSHA512, iterationCount, hashBitLength/8); 

我見過它使用HMACSHA256一個例子,但它的鹽設置爲128位和整體哈希位長度爲256 爲什麼會採取這種方式?

我讀過512位可能是矯枉過正,但在存儲方面,它並不關心我(我不知道性能如何受到影響,但我沒有測試過)。

鹽的長度應與整個生成的散列值相同。 它應該是一半? 或者它應該超過某個閾值並低於整體長度?

我的直覺告訴我做這件事的方式是正確的(除了可能是512位),因爲我懷疑我得到的是最大熵,但我不是密碼學家。

有人可以請澄清這一點嗎?

回答

3

它確實不需要那麼大,但讓我們明白爲什麼。鹽的目的是:

  1. 如果兩個人有相同的密碼,那麼'散列'結果不應該是相同的。
  2. 預防rainbow table attacks

第一點可以通過簡單地用一個計數器來完成 - 至少,防止重複自己的數據庫,但可能無法阻止你的數據庫中的密碼的哈希被相同的哈希在別人的數據庫中使用相同的密碼。這使我們想到了第二點。

如果只是簡單地使用一個從零開始的計數器,那麼可以基於它構造一個彩虹表。鹽越大,彩虹桌就越有可能有效。這些表與鹽的大小成指數增長,所以你的鹽真的不需要那麼大才能排除這種攻擊。

很難指出一個最小尺寸,但我可以向你保證,128位是綽綽有餘。作爲一名安全代碼審計員,我個人當然不會提出一個小至64位的鹽的問題。

有關此主題的安全建議的一個重大問題是沒有人分析過它 - 相反,您只是從聲稱自己是專家的人那裏獲得盲目推薦。我寫了一篇關於password processing的論文。具體見第3節關於我對鹽的咆哮。

備註:完全排除彩虹表,不要使用計數器。相反,選擇你的鹽'足夠大'(如上),並以不可預知的方式。

+0

感謝您的論文鏈接,這裏有很多需要閱讀的內容。 還有一些我仍然需要的答案: 1)salt的長度應該和hash一樣長嗎?即如果我使用HMAC512,鹽應該是512位? 我看到一些消息來源說,鹽和哈希算法是無關的,而另一些人說他們應該是相同的長度。 2)更長時間的鹽不會造成更多的計算成本更高的攻擊?或者它只是唯一性而不是鹽的長度(例如,256位鹽與4096鹽一樣安全?) – Steviebob

+0

@Steviebob:1)不,鹽長與散列之間沒有關係。事實上,昨天剛剛發現NIST現在說鹽只有32位 - 參見[5.1.1.2節的底部](https://pages.nist.gov/800-63-3/sp800-63b的.html#sec5)。那些聲稱它需要與哈希長度相同的人不知道他們在說什麼,作爲他們缺乏理由證明索賠的證據。 2)鹽不會使計算成本更高。它用於唯一性,防止重複輸出和彩虹攻擊。 – TheGreatContini