2009-12-14 50 views
1

我有我的應用程序的一部分存儲文件。因爲我們可能會添加許多相同的文件,所以我首先保留每個文件的散列。如果兩個文件具有相同的散列,那麼我們就丟棄一個,並且對這個文件的「引用」都指向相同的物理文件。我應該如何處理應用程序中的校驗和衝突?

  1. 我應該爲散列碰撞擔心多少?

  2. 在發生碰撞的情況下,我該怎麼辦?到目前爲止,我的代碼的整個關鍵取決於沒有兩個不同的文件具有相同的散列。在現在發生衝突的情況下,我的應用程序會拋出一個合法的不同文件,並使用相同的散列指向該文件。

  3. 我應該使用MD5以外的東西嗎? SHA-1有更好的衝突率嗎?

+3

校驗和!= hash – jldupont 2009-12-14 21:15:44

+0

@jldupont,校驗和通常不是從哈希函數派生的?你能解釋一下這個區別嗎? – KingNestor 2009-12-14 21:26:46

+1

@KingNestor:通常情況下,散列的設計是爲了儘量減少整個域的衝突(以便它可以用於散列表或其他)。校驗和僅用於最小化輸入之間的碰撞,對於這些碰撞,轉錄錯誤(或類似)很可能會將其中一個轉換爲另一個。當然,如果您使用安全的單向函數,那麼它可以滿足任一要求。 – 2009-12-15 00:05:33

回答

4

除非你在一些真正關鍵的應用程序,不要擔心散列衝突。它們非常罕見,許多事情都假設它們不會發生,如果這種假設最終只會失敗一次,那麼災難性事件就會發生在這些事情上。

SHA1具有比MD5更大的輸出空間(同時也知道更少的攻擊),所以它絕對不是更糟糕的選擇。如果你害怕某個人主動碰撞你的哈希值,那麼SHA的後續變體(比如SHA-256)可能是個好主意。

+1

SHA-1碰撞很可能很快就會被展示出來(http://www.schneier.com/blog/archives/2009/06/ever_better_cry.html)。 SHA-256更安全,並確保代碼旨在讓您在未來輕鬆移動到新的散列。 – 2009-12-15 00:13:32

2

任意兩個隨機選擇的比特流的哈希之間發生衝突的概率與哈希表示的不同狀態的數量成反比。因此,64位散列編碼2 ** 64狀態,並且有可能對任何文件對碰撞1/(2**64)。但是你真的關心一個(大)文件集碰撞的可能性,所以你需要做「生日悖論」計算,堵塞成對碰撞的概率和預期的文件數量。

但我認爲,即使數字表示碰撞的概率很小,但不進行比較扔掉文件也是不安全的事情。

+0

SHA-1是一個160位散列。在其中一個存儲2^80個文件的情況下,其他故障模式發生的可能性更大;-)真正的危險是有人惡意提供兩個衝突文件,或強制程序生成兩個衝突文件。 – 2009-12-15 00:15:05

0

在提供的場景中,您不必擔心。 2個不同的文件不可能具有相同的校驗和,除非它們相同。想象一下:

var a = 1; var b = 2;

b + 3 = 5; //真實的耶! a + 3!= 5; //只要var a不等於0就不會碰撞2

具有除2以外的任何值的var'a'永遠不會計算爲5,因此不會發生碰撞。由於使用(或應該使用),1路校驗和散列算法產生的散列值將永遠是依賴於它的輸入

哈希衝突發生時,你在處理隨機生成的哈希值,由於它們的隨機不確定的輸入可能碰撞雖然不太可能。

請注意我絕不會推斷單向哈希算法是通過簡單的加法完成的。我僅僅使用加法作爲一個簡單的例子,它基於一個簡單的概念,即它們都採用一組值並根據它們輸出不同的設置值。

相關問題