MD5仍然足以唯一识别文件吗?

MD5哈希一个文件仍然被认为是一个足够好的方法来唯一标识它给所有的MD5algorithm和安全问题等的破坏? 安全并不是我最关心的问题,但是唯一标识每个文件是。

有什么想法吗?

是。 从安全angular度来看,MD5已经被彻底打破了,但意外碰撞的可能性仍然很小。 只要确保这些文件不是由你不信任的人创build的,并且可能有恶意的意图。

出于实际的目的,创build的散列可能是适当的随机的,但理论上由于鸽子的原理总是存在碰撞的概率。 具有不同的散列意味着文件是不同的,但获得相同的散列并不一定意味着文件是相同的。

为此目的使用散列函数 – 无论安全是否担忧 – 因此总是应该只是检查的第一步,特别是如果已知散列algorithm容易产生冲突。 要可靠地找出两个具有相同散列的文件是否不同,则必须逐字节比较这些文件。

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

既然知道已知的MD5弱点是否适用于给定的上下文是一个微妙的问题,build议不要使用MD5。 使用抗碰撞散列函数(SHA-256或SHA-512)是安全的答案。 另外,使用MD5是坏的公共关系(如果你使用MD5,就要准备好certificate自己;而没有人会质疑你使用SHA-256)。

一个MD5可能会产生冲突。 从理论上讲,尽pipe不太可能,但是一行中的一百万个文件可以产生相同的散列。 在存储值之前,不要testing你的运气并检查MD5冲突。

我个人喜欢创build随机string的MD5,这减less了哈希大文件的开销。 当发现冲突时,我迭代并用附加的循环计数器重新散列。

你可以阅读鸽子的原理 。

我不会推荐它。 如果应用程序可以在多用户系统上工作,那么可能会有用户,这将有两个文件具有相同的MD5散列(他可能是工程师和玩这样的文件,或只是好奇 – 他们很容易从http:/ / /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html ,我自己在写这个答案的时候下载了两个样本)。 另一件事是,一些应用程序可能存储这样的重复出于任何原因(我不知道,如果有任何这样的应用程序,但存在的可能性)。

如果你唯一的识别你的程序生成的文件,我会说可以使用MD5。 否则,我会推荐任何其他没有碰撞的散列函数。

就我个人而言,我认为人们使用原始校验和(select你的方法)的其他对象作为唯一标识符的方式太多,当他们真正想要做的是有唯一的标识符。 指定一个对象用于这个用途不是意图,可能需要更多的思考比使用uuid或类似的完整性机制。

当散列短(<K几个K)string(或文件)时,可以创build两个md5散列键,一个用于实际string,另一个用于与短的不对称string连接的string的反转。 例如:md5(reverse(string ||'1010'))。 添加额外的string可确保即使是由一系列相同位组成的文件也会生成两个不同的密钥。 请理解,即使在这个scheme下,两个哈希键的理论机会对于不相同的string是相同的,但是概率似乎非常小 – 按照单个MD5冲突概率的平方的顺序,并且节省了时间在文件数量不断增长的情况下可能相当可观。 创build第二个string的更精细的scheme也可以考虑,但我不确定这些会大大提高赔率。

为了检查是否有冲突,可以运行这个testing来检查db中所有bit_vector的md5哈希键的唯一性:

从db中selectmd5(bit_vector),count(*),bit_and(bit_vector)和bit_vector
由md5(bit_vector)组成,由bit_and(bit_vector)<> bit_vector

MD5已经被打破,你可以使用SHA1来代替(在大多数语言中实现)