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