減少散列衝突機會的最佳方法:多個散列,還是更大的散列?
我想維護一個唯一數據塊的列表(最大 1MiB),使用塊的 SHA-256 雜湊作為索引中的鍵。顯然存在雜湊衝突的可能性,那麼降低這種風險的最佳方法是什麼?如果我還計算塊的(例如)MD-5 雜湊,並使用組合(SHA-256,MD-5)作為鍵,那麼發生衝突的機會與某些 384 位雜湊函式大致相同,還是因為我使用不同的雜湊函式而更好一點?
謝謝(你的)資訊!
編輯:我的塊來自硬碟驅動器上的普通使用者數據,但總共會有很多 PB。
Edit2:作為後續行動(告訴我是否應該將其移至另一個問題):由於塊的大小可能不同,但可以達到一些預先配置的限制(例如 1MiB),如果我將如何影響抗碰撞性使塊的(64位)大小成為密鑰的一部分?這樣你只能有相同大小的塊碰撞……
碰撞風險只是理論上的;在實踐中不會發生。花時間擔心這種碰撞風險是浪費時間。考慮一下,即使你有 $ 2^{90} $ 1MB 塊(即十億塊——儲存在 1TB 硬碟上,這些磁碟將堆成美國那麼大,幾公里高),發生碰撞的風險低於 $ 2^{-76} $ . 另一方面,被從動物園逃出來的大猩猩咬傷的風險至少是 $ 2^{-60} $ 每天,即比 SHA-256 碰撞的可能性高出 65000 倍,因為它的塊數比可能有意義的要多得多。換句話說,在發生一次碰撞之前,您可以期待 65000 只連續殺人的大猩猩的訪問。因此,如果您知道什麼對您有好處,請放下 MD5 並去買一把霰彈槍。
現在建議連接兩個不同雜湊函式的輸出,比如 SHA-256 和 MD5。事實證明,這並沒有像人們想像的那樣增強安全性。384 位的總大小肯定不會提供比384 位散列函式提供的*更多的衝突安全性;*但它實際上比這要弱得多:它不會比單獨的 SHA-256 強多少。有關血腥細節,請參閱這個先前的問題和這篇研究文章。這可以總結如下:當並行使用多個散列函式並連接輸出時,總的抗碰撞能力並不比最強的單個函式強。
而且,當然,MD5 本身抗碰撞能力很弱,因此不應該為較新的設計設想。
碰撞風險只是理論上的;在實踐中不會發生。
除非在一個特定情況下。給出的描述暗示該系統將成為某種形式的重複數據刪除文件系統或備份系統。對於大多數使用者來說,碰撞風險很小。
但是,對於一類特定的使用者,存在更大的風險。這些使用者是加密雜湊研究人員,他們可以假設他們的 HD 數據內容中的雜湊衝突比普通 joe 更有可能,僅僅是因為他們試圖製造這種衝突。
因此,如果這是一個去重文件系統或備份系統,並且加密雜湊研究人員利用它,兩個不同的數據塊具有衝突雜湊的風險比普通 joe 更大。