Hash 使用两个不同的散列函数是检查文件完整性的好方法吗?

Hash 使用两个不同的散列函数是检查文件完整性的好方法吗?,hash,cryptography,verification,Hash,Cryptography,Verification,我有一个网站,用户可以上传他们的文件;它们存储在服务器上,其元数据记录在数据库中。我正在实施一些简单的完整性检查,即“现在这个文件的内容是否与上载时完全相同?” 例如:对于userfile.jpg的内容,MD5哈希为39f9031a154dc7ba105eb4f76f1a0fd4,SHA-1哈希为878D8D66771E356BF6646BD2EC21FF50CDD4A9如果此文件的内容发生变化,但前后都有相同的MD5散列,SHA-1散列是否也可能保持不变?(使用散列,有时可能会发生散列冲突-两

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

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

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


编辑:我并不真的担心意外损坏,但我应该防止用户在未被注意的情况下更改文件(和朋友)


我可能会使用一个哈希,SHA-512-检查并不经常成为性能瓶颈,而且无论如何,“正如Bruce Schneier所说,已经有足够快的、不安全的系统了。”——@MichaelGG在评论中。”

检查MD5哈希本身就足以满足大多数目的。 尽管您必须这样做,但另外检查SHA1也没有什么害处。请记住,仅仅通过MD5检查就可以捕捉到您可能错过的东西的可能性是极其遥远的


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

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

编辑:澄清一下,没有理由使用两种算法;只要用一个适合你需要的。如果您担心有人在您身上进行MD5冲突(例如,这是一种安全威胁吗?),那么请使用一种没有那么弱的算法,例如SHA256


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

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

我的想法是,提供一个散列可能就足够了;不止一个散列很难验证(必须验证一个散列就足够糟糕了,这取决于平台可用的实用程序),我严重怀疑您是否会看到文件如此惊人的损坏导致完美的冲突


注意:忽略验证是一种痛苦的东西;在重新阅读这个问题后,我修改了这一点——我认为最初的意思是对下载文件的用户进行哈希验证。当然,如果这就是我的意思,那么我认为我所说的仍然适用。

作为一个粗略估计,MD5假阳性的几率是1/(2^128),SHA-1假阳性的几率是1/(2^160),所以两种算法的假阳性几率都在1/(2^128)和1/(2^288)之间,但你可以非常确定它接近1/(2^288)因为这两种算法都经过了彻底的统计测试

至少,当使用两个不同的哈希时,在其中一个算法中可以很好地防止蓄意攻击


编辑:经过一些研究,我偶然发现MD5生日攻击可以在1分钟内完成,所以这里最好使用不同的算法,如MD5和SHA-1。SHA-1的生日攻击目前正在进行。

由于两个哈希的计算方式不同,因此具有相同MD5哈希的两个文件与两个随机文件不太可能具有相同的SHA-1哈希。如果您与任一散列的随机冲突概率为(大概值)2^128,则两个散列的随机冲突概率均为2^256

实际上,你从极低到极低

这相当于从128位加密到256位加密,以避免有人随机猜测您的128位密钥。

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

对于文件加密完整性(例如,确保某人没有恶意替换备用文件),我认为您所说的是安全带和吊带方法

MD5被认为是“弱”的,因为它可以使用相同的哈希值构造两个文档,所需的CPU时间比暴力搜索所需的时间少得多(“MD5的抗冲突性”已被破坏)

但是(据我所知)从以下角度来看,它并不“弱”,如果你有一个任意的文档X,其他人可以用相同的散列创建一个文档Y,这比暴力搜索要容易得多(MD5仍然具有“前图像阻力”)。(这种区别就像去参加派对,找到两个生日相同的人,与找到另一个生日与你相同的人之间的区别。)

即使MD5在这方面被破坏,也不可能有人想出一种算法来创建文档,以匹配任意MD5哈希和任意SHA1哈希

这听起来有点像“不要把所有鸡蛋放在一个篮子里”和“把所有鸡蛋放在一个篮子里,看着篮子”这两条格言之间的张力。或者像在两个死家伙身上花钱一样