Hash

可以將大文件散列到 32 字節,然後從散列中重建嗎?

  • November 23, 2018

我們可以使用 multihash 或 SHA-256 對文件或數據進行雜湊處理,但我們可以從雜湊中檢索原始數據或文件嗎?

是否有任何方法可以在不使用 IPFS 的情況下從其雜湊中檢索原始文件或數據?

或者是否有任何加密方法可以加密 5 MB 文件並輸出 32 字節的類似雜湊的內容,以便我們可以從 32 字節的內容中檢索原始文件?

不,沒有辦法將 5 MB 文件壓縮(或散列或加密或其他)成 32 字節散列,然後僅從散列重建原始文件。

這僅僅是因為5 MB 的文件比 32 字節的雜湊值要多得多*。這意味著,無論您使用什麼散列、壓縮或其他算法,它都必須*將許多不同的 5 MB 文件映射到相同的 32 字節散列。這意味著,僅給定 32 字節的雜湊值,您無法分辨出它是從那些不同的 5 MB 文件中創建的。

事實上,如果您將33 字節文件散列成 32 字節散列,然後嘗試從散列重建原始文件,同樣的事情已經發生。由於 33 字節文件的數量是 32 字節散列的 256 倍,這已經意味著必須有幾個不同的文件具有相同的散列。對於 5 MB 的文件,情況要糟糕很多很多很多倍。


那麼,像IPFS這樣的東西如何工作呢?

基本上,它依賴於這樣一個事實:即使可能的 32 字節雜湊的數量也非常龐大*——比人類曾經創建或可能創建的實際文件(任何長度)的總數要大得多。因此,雖然我們知道肯定有許多可能的文件具有相同的 32 字節散列,但實際上找到兩個恰好具有相同散列的不同文件的機會仍然非常小,我們基本上可以假設它會永遠不會發生。

(此外,像 SHA-256 這樣的加密雜湊函式被設計成,希望沒有實用的方法來故意找到具有相同雜湊的文件,而不是僅僅對大量文件進行雜湊處理,並希望避免發生隨機衝突的可能性。)

這意味著,如果我們有某種(可能是分佈式的)數據庫,其中包含一堆文件及其 SHA-256 雜湊值,那麼我們可以確定它實際上永遠不會包含具有相同雜湊值的兩個文件,即使理論上這是可能的。

因此,只要我們可以訪問這樣的數據庫,我們就可以使用數據庫中任何文件的雜湊值來查找它,並且幾乎100% 確定我們只會得到一個匹配的文件,而不是兩個或更多。從技術上講,獲得多個匹配的機率並不完全為零,但它非常小,在實踐中可以安全地忽略。


*) 實際上,它是 2 8×32 = 115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936。

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