其他的答案似乎并沒有解決你對這個話題的誤解,下面是這樣說的:
鹽的兩種不同用途
我已經看過許多教程,建議將鹽用作以下內容:
$hash = md5($salt.$password)
[...]
我看到的另一個用途是在我的Linux系統上。在/etc/陰影中,散列密碼實際上是用SALT存儲的。
你,你們總必須使用密碼存儲SALT,因為為了驗證用戶根據密碼數據庫輸入的內容,必須將輸入與SALT結合起來,對其進行散列,并將其與存儲的哈希進行比較。
散列的安全性
現在,有彩虹表的人可以倒轉哈希,并得到輸入“foobar”。
[...]
因為te5SBM.7C25fFDu6bIRbX的反向散列已知包含“foo”。
這是不可能扭轉哈希本身(至少在理論上)?!癴oo”的散列和“saltfoo”的散列有沒什么共同之處。即使在加密哈希函數的輸入中更改一位,也應該完全改變輸出。
這意味著您不能用普通密碼構建彩虹表,然后再用一些SALT“更新”它。你必須從一開始就把鹽考慮進去。
這就是為什么你首先需要一張彩虹桌的全部原因。因為您無法從散列中獲得密碼,所以預先計算最可能使用的密碼的所有散列,然后將您的散列與它們的散列進行比較。
鹽質
但是說$salt=foo
“foo”將是極鹽的選擇很差。通常,您會使用一個隨機值,編碼在ASCII中。
另外,每個密碼都有自己的SALT,與系統上的所有其他鹽類不同(希望如此)。這意味著攻擊者必須單獨攻擊每個密碼,而不是希望一哈希值與數據庫中的一個值匹配。
襲擊
如果黑客能拿到這份文件,我看不出鹽有什么用,
彩虹桌攻擊總需要/etc/passwd
(或使用任何密碼數據庫),否則如何將彩虹表中的散列與實際密碼的散列進行比較?
至于目的:假設攻擊者想要為10萬個常用的英語單詞和典型密碼(想想“秘密”)構建一個彩虹表。如果沒有鹽,她將不得不預先計算100,000個散列。即使傳統的UNIX鹽只有2個字符(每個字符都是64個字符中的一個):[a–zA–Z0–9./]
)她必須計算和存儲4096,000,000散列.有了很大的進步。