2010-03-03 68 views
2

我聽說鹽的唯一目的是爲了防止彩虹表攻擊,但它肯定有更多的價值超過這個?它不會防止基於字典的攻擊嗎?那麼蠻力,鹽會有什麼用處呢?你能解釋一下爲什麼嗎?哈希鹽有沒有其他用途比防止彩虹表攻擊?

其次,假設我有一個算法,採用microtime,一個128字符的鹽和一個10億到100億的隨機數,並將它們散列在一起。這是否會提供高度的安全性?因爲即使攻擊者知道其中的一個細節,在我看來,計算其餘部分在計算上仍然是不可行的。不是嗎?

感謝,

編輯:爲了澄清,攻擊者不能訪問到散列算法,因此他們無法垃圾郵件的信息系統。他們所有的就是散列,他們必須弄清楚它是如何編譯的。當然,即使他們知道哈希是如何產生的,試圖用長鹽對所有組合進行暴力破解會使它不切實際嗎?

此外,哈希不是用戶的密碼或用戶名,它只是用於身份驗證的一組隨機字符。所以鹽和隨機數不需要存儲,只是得到的散列。在這種情況下,上述系統會以類似於下面的代碼的形式出現,是一個很好的系統,可以防止攻擊者真實地猜測用戶的哈希值是什麼?

$salt = "some random characters I made up"; 
hash('sha256', microtime(true).$salt.mt_rand(1000,9999)); 

我知道這只是1000-9999而不是上面提到的數十億。

再次感謝。

+0

下次登錄時,系統如何知道創建密碼時的microtime?如果您沒有存儲該文件,則無法驗證登錄。如果你確實存儲了它,那麼它只是鹽的一部分,並且無論如何你都會將鹽粘在數據庫中。 – 2011-07-07 16:23:08

回答

5

否 - 它只能防止彩虹表攻擊。由於攻擊者需要爲每個密碼輸入建立彩虹表。因爲鹽添加了一種可以區分所有其他密碼散列的小辣椒。

基於字典和暴力攻擊在這裏基本上是一回事。醃製不停止這些作爲你的驗證算法是一樣的東西

plain-text-passwd = 'secret provided by user' 
salt = getSalt(username) //looks the salt value up in database based on the users username 
hash-password-in-db = getPassword(username) // looks up hashed password bassed on users username 
if(hash(plain-text-passwd + salt) == hash-password-in-db) //if true, password is correct 

採用基於字典的和暴力破解攻擊的純文本passwd中的值是由反過來獲取與鹽散列用戶垃圾郵件。所以,醃製不執行任何操作

其次,假設我有一個算法...

這是毫無意義的,你需要存儲對用戶信息表,其中5個字符的鹽值用於所有這些信息相同的目的。

3

彩虹表是一種優化方法,可用於字典攻擊和暴力攻擊。

正確使用的鹽使得預計算對於字典和強力攻擊是不可行的。由於彩虹桌是一種預先計算優化,所以它是通過醃製消除的優化之一。

你的第二個例子實際上只是一個較長的鹽,有一些較低的熵部分。因爲鹽應該是一個隨機數,所以你很難區分「隨機數」和「鹽」。