好的,在那裏停止。如果你甚至在詢問鹽漬的問題,你已經走上了錯誤的道路。這是一件容易出錯的事情,有很多糟糕的例子說明如何做到這一點,很容易對完全錯誤的事情過於自信。
最簡單的正確這樣做的方法是使用password_hash
function而不是發明自己奇特的做法。這實際上比你在這裏考慮的要容易得多,也更安全。
password_hash
函數在默認情況下使用Bcrypt內部函數,它是一個哈希函數,它被設計爲非常難以暴力破解並且不能與彩虹表一起使用。它也是可調整的,所以如果你願意,你可以任意使它變得更加困難。
您需要使用此可調整因子來長時間保護您的數據庫。今天很難破解的東西在十年內可能是微不足道的,我們只是不知道。你現在可以更加難以確定,如果你的數據庫確實泄露了,你仍然保護一段時間。
將哈希和salt存儲在同一個表中通常是必需的,將它們分開通常是徒勞的,但攻擊者抓取兩個不同的表幾乎是徒勞無功。無論如何,他們很可能會從你失去控制權的備份中搶佔一切。
現代開裂系統甚至不會打擾彩虹桌。在GPU cracking is so insanely fast的藝術現狀,它使它毫無意義,常見的密碼可以在幾秒鐘內被破解,在幾分鐘內不常見的密碼,並且如果這甚至是優先級,在幾小時或幾天內更晦澀的密碼。比特幣對SHA256的使用促成了該部門的大量研究,使得這些算法對於這種安全性幾乎沒有用處。市場上的設備每秒可以執行多個數萬億次的哈希。
這實際上比您可以從硬盤讀取彩虹錶快。彩虹表基本上是歷史。
今天的威脅是已知密碼的巨大詞典以及將其變爲更多天文數字變體的方法。這些讓GPU保持繁忙,並且可以發現許多人們使用的不太常見的,故意更復雜的密碼。
*「你只需要從特定的彩虹桌上的密碼中消除鹽。」* - 這將如何工作?由於鹽是散列過程不可分割的一部分,因此不能「簡單地消除」它。你將不得不將鹽加入彩虹桌。而且由於鹽對每個密碼都是唯一的,所以您需要爲每個鹽分/密碼創建一個不同鹽度的彩虹表。正是這一點:鹽會迫使攻擊者單獨攻擊每個密碼,這會導致更多的工作,並使暴力行爲迫使大集合不可行。 – deceze
如果他們已經有數據庫。沒有太多的保護。 –
@deceze:其實如果有鹽,作爲攻擊者,你根本就不會爲彩虹桌而煩惱。爲什麼在已經可以看到已經使用的散列時計算每個可能的散列的每個明文? ;)您只需將salt添加到每個密碼猜測中,然後散列以查看它是否匹配 - 這樣,如果要生成完整的彩虹表,您可以提前停止很多事情。 – SilverlightFox