我覺得我應該評論一下這裡的一些回覆。
首先,速度確實是 MD5,還有 SHA1 的一個問題。我為了好玩寫了一個 MD5 破解程式,僅使用我的 CPU,我就可以輕鬆地以每秒約 2 億次雜湊的速度檢查雜湊值。這種速度的主要原因是,在大多數嘗試中,您可以繞過算法中 64 個步驟中的 19 個。對於較長的輸入(> 16 個字元),它將不適用,但我相信有一些方法可以解決它。
如果您在網路上搜尋,您會看到有人聲稱能夠使用 GPU 每秒檢查數十億個雜湊值。如果現在單台電腦就能達到每秒 1000 億次,我不會感到驚訝,而且情況只會越來越糟。這需要一台配備 4 個雙高端 GPU 或類似配置的耗電怪獸,但仍然是可能的。
以下是為什麼每秒 1000 億次是一個問題的原因
假設大多數密碼包含 96 個字元的選項。一個 8 個字元的密碼將有 96^8 = 7,213,895,789,840,000 種組合。
以每秒 1000 億次的速度,那麼需要 7,213,895,789,840,000 / 3600 = 約 20 小時才能算出它的實際內容。請記住,您還需要添加 1-7 個字元的數字。如果您想鎖定單個使用者,20 小時並不算多。
所以本質上
新的雜湊算法被特別設計成不容易在 GPU 上實現是有原因的。
哦,我看到有人提到了 MD5 和彩虹表。如果您閱讀了這裡的數字,我希望您意識到就 MD5 而言,彩虹表變得是多麼的愚蠢和無用。除非 MD5 的輸入非常龐大,否則您將無法與 GPU 競爭。等到儲存媒體能夠產生遠超 3TB/s 的速度時,CPU 和 GPU 的速度將會達到更高的水平。
至於 SHA1,我相信它比 MD5 慢三分之一左右。我自己無法驗證這一點,但根據 MD5 和 SHA1 的數據來看,情況似乎如此。速度問題基本上也和這裡一樣。
這裡的寓意
請務必照做。絕對不要再使用 MD5 和 SHA1 來雜湊密碼。我們都知道,大多數人的密碼並不會很長,這是一個主要的缺點。加長鹽值當然會有幫助,但除非你打算加上幾百個位元組的鹽值,否則總會有快速暴力破解應用程式可以反向工程你的密碼或你使用者的密碼。