考虑到MD5算法的所有突破和安全性问题等,MD5散列文件仍然被认为是一种足以唯一标识该文件的好方法吗?安全不是我主要关注的问题,而是唯一标识每个文件。
有什么想法吗?
考虑到MD5算法的所有突破和安全性问题等,MD5散列文件仍然被认为是一种足以唯一标识该文件的好方法吗?安全不是我主要关注的问题,而是唯一标识每个文件。
有什么想法吗?
Answers:
是。从安全角度来看,MD5已被完全破坏,但是意外碰撞的可能性仍然很小。只要确保文件不是由您不信任的人创建的,并且可能有恶意。
出于实践目的,创建的哈希可能适当地是随机的,但是由于Pigeonhole原理,理论上总是存在发生冲突的可能性。拥有不同的哈希当然意味着文件是不同的,但是获得相同的哈希并不一定意味着文件是相同的。
为此,无论是否考虑安全性,使用哈希函数始终应始终只是检查的第一步,尤其是如果已知哈希算法很容易造成冲突的话。为了可靠地找出具有相同散列的两个文件是否不同,您必须逐字节比较这些文件。
如果您没有对手,那么MD5就足够了。但是,某人可以(有目的地)创建两个不同的文件,这些文件散列为相同的值(称为冲突),根据您的具体情况,这可能是问题也可能不是问题。
由于知道已知的MD5弱点是否适用于给定的上下文是一个微妙的问题,因此建议不要使用MD5。使用抗碰撞的哈希函数(SHA-256或SHA-512)是安全的答案。同样,使用MD5不利于公共关系(如果您使用MD5,请准备好为自己辩护;而没有人会质疑您使用SHA-256)。
return 0;
转换为a return 1;
),因此字节之间的比较可能会失败。这是极不可能的,但与SHA-256发生碰撞的风险甚至更低。从数学上讲,您不能确保两个哈希值相同的文件是相同的,但是只要您使用计算机进行比较,就无法通过比较文件本身来确定这一点。我的意思是,超过99.999 .... 9%的确定性毫无意义,而SHA-256已经提供了更多的确定性。
我不推荐它。如果该应用程序可以在多用户系统上运行,则可能会有用户使用两个具有相同md5哈希值的文件(他可能是工程师,并且正在使用此类文件,或者只是好奇-可以从http:/轻松下载它们/www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html,我自己在编写此答案时下载了两个样本。另一件事是,某些应用程序可能出于任何原因存储此类重复项(我不确定是否存在任何此类应用程序,但可能存在)。
如果您唯一地标识由程序生成的文件,则可以使用MD5。否则,我会建议任何其他尚无冲突的哈希函数。
MD5已损坏,您可以改用SHA1(在大多数语言中实现)
当对短(小于K个)字符串(或文件)进行散列时,一个可以创建两个md5散列键,一个用于实际字符串,第二个用于与短非对称字符串连接的字符串的反向。示例:md5(反向(字符串||'1010'))。添加额外的字符串可确保即使由一系列相同的位组成的文件也会生成两个不同的密钥。请理解,即使在这种方案下,对于不相同的字符串,两个哈希键在理论上也是相同的,但是概率似乎非常小-大约是单个md5碰撞概率的平方,并且节省了时间文件数量不断增长时可能会非常可观。也可以考虑使用更复杂的方案来创建第二个字符串,
要检查冲突,可以针对db中所有bit_vector的md5哈希键的唯一性运行此测试:
从db中选择md5(bit_vector),count(*),bit_and(bit_vector)与bit_vector
按md5(bit_vector)组,具有bit_and(bit_vector)<> bit_vector的bit_vector
我喜欢将MD5视为存储大量文件数据时可能性的指标。
如果哈希值相等,那么我就知道我必须逐字节比较文件,但是由于错误的原因,这种情况可能只会发生几次,否则(哈希值不相等)我可以确定我们正在谈论两个不同的文件。