Hash

用於查找重複數據的雜湊函式,在什麼時候機會匹配的風險足以切換到更強的雜湊或字節驗證?

  • March 3, 2017

在許多數據管理系統中,雜湊被用作一種數據指紋,其目的不是以密碼方式擊敗對手,而是通過查看系統中是否已經存在具有給定雜湊的其他數據來快速辨識重複數據。

這方面的一個例子是 ZFS 文件系統中的重複數據刪除,它可以使用 fletcher-4(用於快速排除檢查)或 sha-256,如果找到匹配的雜湊,還可以選擇逐字節檢查,以確認如果它是不同數據的偶然匹配,或者是真正的重複數據項。

如果以這種方式使用散列函式,記錄的數量可能會非常龐大——想想亞馬遜的雲系統或其他主要數據儲存,並想像在 4k-128k 數據塊上執行 dedup。因此,發生碰撞的方式組合起來會增加,就像眾所周知的人們共享生日的機會一樣,一個非常不可能的事件(2 個不同的文件或數據項/文件塊具有不同的數據但具有相同的雜湊值)變為出乎意料的可能。

問題是,如果數據 X 和數據 Y 具有相同的雜湊值,並且在匹配時沒有逐字節檢查,那麼當文件包含 Y 時,系統將返回 X,因為它儲存了一份相信數據的副本X 和 Y 基於它們匹配的雜湊值相同。

假設數據儲存主機想要保證沒有錯誤辨識,他們可能必須逐字節檢查。但是,如果他們準備接受一些小的理論風險(例如 10^-20),即匹配雜湊不代表池中任何數據的匹配數據,那麼他們需要弄清楚要使用的雜湊有多“強”以及是否支持通過逐字節檢查匹配來獲得該風險。我的問題是,他們應該如何做出這個決定(在理論上和實踐中)。

理論上,考慮到很好的理想化假設,這似乎很容易:

  • 數據集包​​含 N 個項目,其唯一性將通過比較雜湊來確定,
  • 一個給定的散列函式被認為會在 2^M 個輸出值中產生真正的“隨機”輸出(所有值都同樣可能,或者任何正確的表達式,在仔細檢查現代散列函式時進行測試),
  • 使用者考慮到某個特定值 E 用於儲存的整個數據項的匹配錯誤風險,例如 0 < E << 1(並且可能 E < 10^-lots),
    並且
  • 出於所有實際目的,假設數據項的雜湊值是完全隨機的(數據不會增加任何兩個被雜湊的數據項之間不匹配情況的風險)

那麼不難計算雜湊是否有可能實現這一點。

但在實踐中,這可能是評估風險的一種非常不恰當的方式。也許雜湊值可能存在一些偏差;錯誤的代價可能很大,並且需要的風險非常小(如果尋求足夠小的機率,散列可能不是完全隨機的?);數據集可能包含許多密切相關的數據項(來自常見文件的變體或衍生文件的 4k 塊);字節檢查的成本可能很高,這表明“更強”散列的中途解決方案幾乎沒有預期的異常,並且僅按字節檢查這幾個數據項,並且在任何情況下都不清楚 E 的什麼值會被認為是“合理的”給定的場景以及如何評估它。

我無法進一步思考這個問題,因為我缺乏這方面的專業知識——雜湊的細節,也許還有我沒有想到的其他加密相關問題。底線是關於如何從加密和實際的角度進行評估,選擇散列 + 選擇是否通過字節檢查來備份明顯的散列衝突,以獲取巨大的數據集。

具有密碼學知識和實用知識的人能否建議計劃新數據集或記錄儲存的人如何最好地解決這種決定,因為它是一個潛在的問題?在我的情況下,是否“可能”在大型/巨大數據集上出現現代雜湊(例如 SHA256)的問題(無論那個詞可能是什麼意思!),如果是,在什麼時候?

假設

出於所有實際目的,假設數據項的雜湊值是完全隨機的

是不現實的(很容易建構雜湊值是偶數的數據項)。幸運的是,我們可以這樣做:

  1. 數據集的準備涉及的計算不超過 $ N $ 雜湊
  2. 使用的雜湊是加密安全的 $ M $ 位雜湊
  3. 使用者心中有一些特定的價值 $ \epsilon $ 對於儲存的整個數據項之間存在匹配錯誤的風險,例如 $ 0<\epsilon\ll 1 $ (而且可能 $ \epsilon<10^{-\text{lots}} $ ).

如果 $ N\le\sqrt{2^{M+1}\epsilon} $ 然後滿足安全目標;這是從加密安全散列的定義和生日問題的平方近似得出的

如果我們使用 $ M=256 $ (比如說 SHA-256,假設這仍然完好無損),並且想要 $ \epsilon=10^{-18}>2^{-60} $ (百萬分之一的機會),那麼我們最適合 $ N=2^{98.5} $ (超過 4 億個用於準備數據集的雜湊值),這比 2017 年人類計算的雜湊值要多得多。

引用自:https://crypto.stackexchange.com/questions/44385