代码之家  ›  专栏  ›  技术社区  ›  Ranhiru Jude Cooray

MD5是否仍然足以唯一标识文件?

  •  131
  • Ranhiru Jude Cooray  · 技术社区  · 14 年前

    考虑到MD5算法的所有缺陷和安全问题,MD5散列文件仍然被认为是一种足够好的方法来唯一地识别它吗?在这里,安全性不是我主要关心的问题,但唯一标识每个文件的是。

    9 回复  |  直到 7 年前
        1
  •  89
  •   Marcelo Cantos    14 年前

    对。从安全的角度来看,MD5已经完全被破坏,但意外碰撞的概率仍然很小。只需确保这些文件不是由你不信任的人创建的,他们可能有恶意。

        2
  •  31
  •   stapeluberlauf    14 年前

    出于实际目的,创建的散列可能是适当随机的,但是 总是有发生碰撞的可能性,因为 Pigeonhole principle . 拥有不同的散列当然意味着文件是不同的,但是获得相同的散列并不一定意味着文件是相同的。

        3
  •  20
  •   Thomas Pornin    14 年前

    如果你没有对手,MD5就足够了。但是,有人可以(故意)创建两个不同的文件,它们散列到相同的值(称为冲突),这可能是问题,也可能不是问题,具体取决于您的具体情况。

    由于知道已知的MD5弱点是否适用于给定的上下文是一件很微妙的事情,因此建议不要使用MD5。使用抗冲突哈希函数(SHA-256或SHA-512)是安全的答案。此外,使用MD5是不好的公共关系(如果您使用MD5,请准备好为自己辩护;而没有人会质疑您使用SHA-256)。

        4
  •  9
  •   afilina    13 年前

    md5会产生冲突。理论上,虽然可能性很小,但是一行一百万个文件可以产生相同的散列。在存储该值之前,不要测试运气并检查md5冲突。

    我个人喜欢创建随机字符串的md5,这减少了散列大文件的开销。当发现冲突时,我迭代并使用附加的循环计数器重新散列。

    你可以在 pigeonhole principle .

        5
  •  6
  •   tach    12 年前

    http://www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html ,我自己在写这个答案的时候下载了两个样本)。另一件事是,有些应用程序可能出于任何原因存储这样的重复项(我不确定是否存在这样的应用程序,但存在这种可能性)。

    如果您是唯一标识由您的程序生成的文件,我会说,这是可以使用MD5。否则,我建议使用任何其他尚不知道冲突的散列函数。

        6
  •  2
  •   hpavc    14 年前

        7
  •  0
  •   Guillaume Lebourgeois    14 年前

    MD5已损坏,可以改用SHA1(在大多数语言中实现)

        8
  •  0
  •   marcopolo    8 年前

    当散列短(<几个K?)字符串(或文件)一个可以创建两个md5哈希键,一个用于实际字符串,另一个用于与短的非对称字符串连接的字符串的反向。示例:md5(反向(字符串| |“1010”)。添加额外的字符串可以确保即使是由一系列相同位组成的文件也会生成两个不同的密钥。请理解,即使在这种方案下,对于不相同的字符串,两个散列键在理论上也是相同的,但是概率似乎非常小——按单个md5冲突概率的平方顺序排列,并且当文件数量增加时,节省的时间也相当可观。也可以考虑更详细的创建第二个字符串的方案,但我不确定这些方案是否会大大提高几率。

    要检查冲突,可以运行此测试,以检查数据库中所有位向量的md5哈希键的唯一性:

    从具有位向量的数据库
    具有位和(位向量)<gt;位向量

        9
  •  0
  •   Shimmy Weitzhandler 500 - Internal Server Error    6 年前

    在存储大量文件数据时,我喜欢将MD5视为概率指标。

    如果散列相等,我知道我必须逐字节比较文件,但这可能只发生几次,因为一个错误的原因,否则(散列不相等),我可以肯定,我们谈论的是两个不同的文件。