使用2种不同的哈希函数是检查文件完整性的好方法吗?

时间:2009-02-11 17:58:01

标签: hash cryptography verification

我有一个用户可以上传文件的网站;这些存储在服务器上,其元数据记录在数据库中。我正在实现一些简单的完整性检查,即“这个文件的内容现在是逐字节的,与上传时相同吗?”

示例:对于userfile.jpg的内容,MD5哈希为39f9031a154dc7ba105eb4f76f1a0fd4,SHA-1哈希为878d8d667721e356bf6646bd2ec21fff50cdd4a9如果此文件的内容发生变化,但之前和之后具有相同的MD5哈希值,那么SHA-1哈希值是否也可能保持不变?(使用散列,有时可能会发生哈希冲突 - 这可能会同时出现两种不同的哈希算法吗?)

或者为一个文件计算两个不同的哈希值(我应该尝试其他一些机制来验证完整性)?


编辑:我并不是真的担心意外损坏,但我应该阻止用户不加注意地更改文件(birthday attack和朋友)。

我可能会使用一个哈希值SHA-512 - 这些检查通常不会成为性能瓶颈,无论如何,“正如布鲁斯施奈尔所说,那里已经有足够快速,不安全的系统了。 - @ MichaelGG在评论中写道“。

6 个答案:

答案 0 :(得分:7)

MD5对你正在做的事情可能是安全的,但是没有理由继续使用已知缺陷的哈希。事实上,没有理由你不应该使用SHA256或SHA512,除非你有一些已知的主要性能瓶颈。

编辑:为了澄清,没有理由使用两种算法;只需使用符合您需要的产品。如果您担心人们会对您进行MD5冲突(例如,这是一种安全威胁吗?),那么请使用一种不那么弱的算法,例如SHA256。

编辑2:解决一个显然仍然常见的误解:在哈希上找到随机碰撞的概率不是1/2 ^ n。它接近1/2 ^(n / 2)。因此,128位散列可能会与2 ^ 64次尝试发生冲突。有关详细信息,请参阅birthday attack

答案 1 :(得分:4)

对于大多数用途,单独检查MD5哈希就足够了。 虽然如果必须,但另外检查SHA1没有坏处。请记住,只要MD5检查非常偏远,就有可能捕捉到你想念的东西。

请注意,就可伸缩性而言,额外检查会在您的服务器上增加不必要的负载。

答案 2 :(得分:2)

对于文件完整性(例如意外/随机损坏),一个哈希就足够了。 128位= 2 -128 未检测到错误的概率,这对于所有实际目的而言都足够小。

对于文件加密完整性(例如,保证某人没有恶意替换备用文件),我认为您正在讨论一种腰带和吊带方法。

MD5被认为是“弱”的,因为它可以构造两个具有相同哈希值的文档,所需的CPU时间比蛮力搜索所需的CPU时间少得多(MD5的“碰撞阻力”)已被打破)。

但是,据我所知,它不是“弱”,如果你有一个任意文件X,其他人可以使用相同的哈希创建一个文件Y,比蛮力更容易搜索(MD5仍具有“原像素抗性”)。 (区别就像参加派对和找到同一个生日的两个人,而不是找到与你的生日相同的另一个人。)

即使MD5在这方面被打破,也不太可能有人能够创建一个算法来创建文档以匹配任意MD5哈希一个arbritrary SHA1哈希。

这听起来有点像两句格言之间的紧张关系“不要把所有的鸡蛋都放在一个篮子里”而不是“把所有鸡蛋放在一个篮子里,然后看篮子”。或者就像在两个电子锁上花钱,而一个电子锁的锁是两倍,并且成本是原来的两倍。理想情况下,最好花费CPU时间来计算一个安全256位哈希,而不是使用不同算法的两个安全性较低的128位哈希值。 (是的我知道SHA1是160位,这只是一个例子)你更有可能以这种方式获得更好的性能以获得所需的安全级别 - 也就是说,如果 256位哈希是没坏。如果它被打破了,你可能最好采用双算法来对冲你的赌注。

但是,如果这只是保护错误的完整性,那么一个MD5哈希就可以了。

编辑:引用一些有用的资料来源: 1 2 3"MD5 considered harmful today"RFC4270NIST's latest update on the SHA-3 competition"The SHA-3 Zoo"

答案 3 :(得分:1)

通常,如果MD5哈希值不匹配,则SHA1(或任何其他类似哈希)也不匹配。我不会说没有可能发生的情况(因为我们都知道这两种算法都存在冲突),但我想说在您的情况下可能永远不会发生冲突。

我的想法是,提供一个哈希可能足够了; 多个哈希变得很难验证(必须验证一个很糟糕,取决于平台的可用实用程序),我严重怀疑你会看到如此惊人的文件损坏导致完美的碰撞。

注意:忽略验证令人痛苦的事情;在重新阅读这个问题后,我对此进行了修改 - 我将原来的意思用于下载文件的用户的哈希验证。当然,如果 是什么意思,那么我认为我所说的仍然适用。

答案 4 :(得分:1)

粗略估计,MD5误报的几率为1 /(2 ^ 128),SHA-1误报的几率为1 /(2 ^ 160),因此两种算法均为假阳性的可能性在1 /(2 ^ 128)和1 /(2 ^ 288)之间,但你可以非常肯定它接近1 /(2 ^ 288),因为两种算法都经过了统计学上的彻底测试。

至少,当使用两个不同的哈希值时,您可以很好地保护其中一种算法免受故意攻击。

编辑:经过一番研究,我偶然发现Wikipedia Note MD5生日攻击可以在1分钟内完成,所以在这里使用不同的算法MD5和SHA-1似乎更好。 SHA-1的生日攻击此刻需要2^69 operations

答案 5 :(得分:1)

由于两个哈希值的计算方式不同,因此具有相同MD5哈希值的两个文件不太可能具有与两个随机文件相同的SHA-1哈希值。如果你随机碰撞任何一个哈希的机会是(球场)2 ^ 128,你在两者中随机碰撞的几率将是2 ^ 256。

实际上,你会从极低到极低,极低。

这是从128位加密到256位加密的等效,以避免让某人随机猜测你的128位密钥。