5

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

一个例子:对于 的内容userfile.jpg,MD5 哈希是39f9031a154dc7ba105eb4f76f1a0fd4SHA-1 哈希是878d8d667721e356bf6646bd2ec21fff50cdd4a9如果这个文件的内容发生了变化,但前后的 MD5 哈希值相同,那么 SHA-1 哈希值是否也可能保持不变?(使用散列,有时您可能会遇到散列冲突 - 这会同时使用两种不同的散列算法吗?)

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


编辑:我并不真正担心意外损坏,但我应该防止用户更改文件而不引起注意(生日攻击和朋友)。

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

4

6 回答 6

7

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

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

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

于 2009-02-11T18:01:24.227 回答
4

在大多数情况下,单独检查 MD5 哈希就足够了。尽管如果必须的话,另外检查 SHA1 也没有什么坏处。请记住,仅通过 MD5 检查来捕获您会错过的东西的可能性非常小。

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

于 2009-02-11T17:59:49.613 回答
2

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

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

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

但它不是(据我所知)“弱”,如果你有一个任意文档 X,其他人可以创建一个具有相同哈希的文档 Y,比蛮力搜索(MD5仍然具有“原像抗性”)。(区别就像去参加聚会并找到两个生日相同的人与找到另一个与你生日相同的人之间的区别。)

即使 MD5 在这方面被破坏,也不太可能有人能够提出一种算法来创建文档以匹配任意 MD5 散列任意 SHA1 散列。

这听起来有点像“不要把所有的鸡蛋放在一个篮子里”与“把所有的鸡蛋放在一个篮子里,看着篮子”这两条格言之间的张力。或者就像花钱买两个锁舌锁和一个锁舌锁,后者好一倍,成本也高一倍。理想情况下,最好花 CPU 时间计算一个安全的 256 位哈希,而不是使用不同算法的两个不太安全的 128 位哈希。(是的,我知道 SHA1 是 160 位,这只是一个说明)您更有可能通过这种方式获得更好的性能以获得所需的安全级别——也就是说,如果256 位哈希没有被破坏。如果它被打破,你可能会更好地使用两种算法方法来对冲你的赌注。

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

编辑:引用一些有用的资源: 1 2 3“MD5 认为今天有害”RFC4270NIST 对 SHA-3 竞赛的最新更新,以及“SHA-3 动物园”

于 2009-02-11T18:15:36.313 回答
1

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

我的想法是提供一个哈希可能就足够了。多个哈希变得难以验证(必须验证一个是否足够糟糕,具体取决于平台的可用实用程序),而且我严重怀疑您是否会看到文件如此惊人的损坏以导致完美冲突。

注意:忽略验证是痛苦的东西;重新阅读问题后,我对此进行了修改-我将原始含义视为用户下载文件的哈希验证。如果,当然,这就是意思,那么我说的仍然适用,我想。

于 2009-02-11T18:01:59.373 回答
1

粗略估计,MD5 误报的几率是 1/(2^128),SHA-1 误报的几率是 1/(2^160),因此两种算法的误报几率都在 1 之间/(2^128) 和 1/(2^288),但您可以确定它接近 1/(2^288),因为这两种算法都经过了全面的统计测试。

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

编辑:经过一些研究,我偶然发现了这个Wikipedia 注意,MD5 生日攻击可以在 1 分钟内完成,所以在这里使用不同的算法作为 MD5 和 SHA-1 似乎更好。SHA-1 的生日攻击目前需要2^69 次操作

于 2009-02-11T18:07:05.383 回答
1

因为这两个散列的计算方式不同,所以具有相同 MD5 散列的两个文件与两个随机文件相比,具有相同 SHA-1 散列的可能性不大。如果您与任一散列发生随机冲突的机会是 (ballpark) 2^128,那么您在两者中发生随机冲突的机会将是 2^256。

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

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

于 2009-02-11T18:08:23.867 回答