簡體   English   中英

我應該如何處理應用程序中的校驗和沖突?

[英]How should I be handling checksum collisions in my application?

我的應用程序中有一部分存儲文件。 因為我們可能會添加許多相同的文件,所以我首先保留每個文件的哈希值。 如果兩個文件具有相同的散列,則我們拋出一個散列,並且對該文件的兩個“引用”都指向同一物理文件。

  1. 我應該為哈希沖突擔心多少?

  2. 發生碰撞時該怎么辦? 到目前為止,我的代碼的全部問題取決於沒有兩個具有相同哈希值的不同文件。 如果發生沖突,我的應用程序會拋出合法不同的文件,並指向具有相同哈希值的文件。

  3. 我應該使用MD5以外的產品嗎? SHA-1的碰撞率更高嗎?

除非您使用的是真正至關重要的應用程序,否則不要擔心哈希沖突。 它們是如此罕見,以至於許多事情假設它們不會發生,而如果該假設僅一次成為錯誤,那么災難性的事物就會發生在這些事物上。

SHA1的輸出空間比MD5大(並且對它的攻擊也更少),因此絕對不是一個更糟糕的選擇。 如果您擔心有人會積極地碰撞您的哈希,那么SHA的更高版本(例如SHA-256)也許是個好主意。

任何兩個隨機選擇的位流的哈希之間發生沖突的機會與哈希表示的不同狀態的數量成反比。 因此,64位哈希編碼2 ** 64個狀態,並且任何一對文件都有1 / (2**64)沖突的機會。 但是,您確實擔心一個(大)文件集發生沖突的可能性,因此您需要進行“生日悖論”計算,插入成對沖突的可能性和預期的文件數。

但我認為,最重要的是即使不進行比較就丟棄文件也是不安全的,即使數字表明發生碰撞的可能性很小。

在提供的方案中,您不必擔心。 除非兩個文件都不相同,否則兩個文件不可能具有相同的校驗和。 想象一下:

var a = 1; var b = 2;

b + 3 = 5; //是的! a + 3!= 5; //只要var a不等於2,就不可能發生碰撞

帶有非2值的var'a'永遠無法計算為5,因此不可能發生沖突。 由於您正在使用(或應該使用)單向校驗和哈希算法,因此所得哈希將始終取決於其輸入

當您處理隨機生成的哈希時,會發生哈希沖突,這些哈希由於其隨機未指定的輸入而可能會碰撞,盡管可能性很小。

請注意,我絕不推斷哈希算法是通過簡單加法完成的一種方法。 我只是將加法作為一個簡單的示例,基於一個簡單的概念,即它們都采用一組值並根據它們輸出不同的設置值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM