MD5散列文件是否仍然被认为是一种足够好的方法来鉴别MD5算法和安全问题等所有内容?安全性不是我的主要关注点,但唯一标识每个文件的是。
有什么想法吗?
答案 0 :(得分:86)
是。从安全角度来看,MD5已完全被打破,但意外碰撞的可能性仍然很小。请确保文件不是由您不信任的人创建的,并且可能有恶意。
答案 1 :(得分:31)
出于实际目的,创建的哈希可能是适当的随机,但理论上由于Pigeonhole principle,总是存在冲突的可能性。拥有不同的哈希值肯定意味着文件不同,但获取相同的哈希值并不一定意味着文件是相同的。
为此目的使用哈希函数 - 无论是否考虑安全性 - 因此应始终只是检查的第一步,特别是如果已知哈希算法容易产生冲突。为了可靠地找出具有相同散列的两个文件是否不同,您必须逐个字节地比较这些文件。
答案 2 :(得分:19)
由于知道已知的MD5弱点是否适用于给定的上下文是一个微妙的问题,因此建议不要使用MD5。使用抗冲突哈希函数(SHA-256或SHA-512)是安全的答案。此外,使用MD5是糟糕的公共关系(如果您使用MD5,请准备好自己辩护;而没有人会质疑您使用SHA-256)。
答案 3 :(得分:9)
md5会产生碰撞。从理论上讲,虽然不太可能,但连续一百万个文件可以产生相同的哈希值。在存储值之前,不要测试你的运气并检查md5碰撞。
我个人喜欢创建随机字符串的md5,这样可以减少散列大文件的开销。当发现冲突时,我迭代并重新散列附加的循环计数器。
您可以阅读pigeonhole principle。
答案 4 :(得分:6)
我不推荐它。如果应用程序可以在多用户系统上运行,那么可能有用户,这将有两个具有相同md5哈希值的文件(他可能是工程师并使用这些文件,或者只是好奇 - 可以从{{3)轻松下载我自己在写这个答案时下载了两个样本)。另一件事是,某些应用程序可能出于任何原因存储此类重复项(我不确定,如果有任何此类应用程序但存在可能性)。
如果您唯一地识别程序生成的文件,我会说可以使用MD5。否则,我会推荐任何其他没有冲突的散列函数。
答案 5 :(得分:2)
我个人认为人们使用其他对象的原始校验和(选择你的方法)作为唯一标识符,当他们真正想要做的是具有唯一标识符时。为这种用途指纹识别对象不是意图,并且可能需要比使用uuid或类似的完整性机制更多的思考。
答案 6 :(得分:0)
MD5已被破坏,您可以使用SHA1(在大多数语言中实现)
答案 7 :(得分:0)
当散列短(&几个K?)字符串(或文件)时,可以创建两个md5散列键,一个用于实际字符串,另一个用于与短非对称字符串连接的字符串的反向。示例:md5(reverse(string ||' 1010'))。添加额外字符串可确保即使由一系列相同位组成的文件也会生成两个不同的键。请理解,即使在这种方案下,理论上有两个哈希键对于非相同的字符串是相同的,但概率看起来非常小 - 某个md5冲突概率的平方顺序,节省时间当文件数量增长时可能会很大。可以考虑更复杂的方法来创建第二个字符串,但我不确定这些会大大提高几率。
要检查冲突,可以运行此测试以获取db中所有bit_vectors的md5哈希键的唯一性:
选择md5(bit_vector),count(*),bit_and(bit_vector)
来自db with bit_vector
按md5(bit_vector),bit_vector分组
具有bit_and(bit_vector)<> bit_vector
答案 8 :(得分:0)
我喜欢将MD5视为存储大量文件数据时的概率指标。
如果哈希值相等,那么我知道我必须逐字节地比较这些文件,但这可能只是因为错误的原因而发生了几次,否则(哈希值不相等)我可以肯定我们正在讨论两个不同的文件。