繁体   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