Sha-256

SHA-256 與 SHA-1 的 Merkle 樹(dm-verity)

  • February 5, 2016

是否有關於在 Merkle 樹中使用不同雜湊函式的知識或研究?我的案例是文件完整性保護。由於性能限制,我正在考慮使用不同的雜湊函式:

Linux 設備映射器驗證目標允許您選擇不同的雜湊函式。我最初的目標是 SHA-256,但是 SHA-1 明顯更快,我想知道在 Merkle 樹中使用時它的不安全性是否仍然存在。(順便說一句:根雜湊受 RSA 簽名保護)假設儲存設備具有 2GB 的數據和 4Kb 的塊,verity 在數據和根雜湊之間創建一個具有 3 個樹級別的默克爾樹。我知道單個 SHA-1 對於文件的完整性是不安全的,但是對於每 4Kb 文件有一個雜湊的方法呢?如果攻擊者僅更改一個塊,則中間雜湊的輸入數據僅更改 20 個字節(SHA-256 為 32 個字節),而剩餘的 4064 (4076) 個字節相同。那麼這是否使發現碰撞變得更加困難,或者這是一種誤解?數據的這種部分變化會傳播到樹的根部。

好的,僅更改一個在相應雜湊中發生衝突的數據塊會破壞雜湊樹,因為底部的衝突會產生相同的雜湊樹。使用 SHA-1 更容易,不是嗎?

如果沒有衝突的塊中的變化,中間節點的衝突必須導致相同的根雜湊值,該怎麼辦?這更難嗎?

對於這樣的案例,您會建議什麼雜湊?沒有建議使用 dm-verity 的 Linux 核心實現。SHA-1 太弱了嗎?

SHA-1 明顯更快,我想知道在 Merkle 樹中使用時它的不安全性是否仍然存在。

是的,不安全感仍然存在。底層散列函式中的任何碰撞都可用於在 Merkle 樹的根中產生碰撞。一個簡單的例子:

假設我們的 SHA-1 Merkle 樹有兩個葉節點, $ a $ 和 $ b $ ,並且我們知道一個 SHA-1 碰撞,這樣 $ \text{SHA-1}(m_1) = \text{SHA-1}(m_2) $ 但 $ m_1 \neq m_2 $ . Merkle 樹的根雜湊為 $ h = \text{SHA-1}(\text{SHA-1}(a) | \text{SHA-1}(b)) $ .

我們可以通過設置創建兩個具有相同根雜湊的不同樹 $ a $ 至 $ m_1 $ 在一棵樹上,並且 $ a $ 至 $ m_2 $ 在另一個(並保持 $ b $ 兩棵樹都一樣)。這些樹將具有相同的根雜湊: $ \text{SHA-1}(\text{SHA-1}(m_1) | \text{SHA-1}(b)) = \text{SHA-1}(\text{SHA-1}(m_2) | \text{SHA-1}(b)) $ , 因為 $ \text{SHA-1}(m_1) = \text{SHA-1}(m_2) $ . 換句話說,攻擊者可以在沒有根節點“注意到”的情況下交換樹底部的塊。

使用 Merkle 樹並不能防止底層雜湊函式的抗碰撞問題。如果安全性是這裡的重要考慮因素,我不建議使用 SHA-1。

通常,我會推薦使用 BLAKE2。它(嗯,它的前身)是 SHA-3 競賽的決賽選手(即它是安全的),它比 SHA-1 和 MD5 都快。不幸的是,我不知道它是否在 dm-verity 中可用。

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