SHA-256或MD5用于文件完整性。

113

我知道SHA-256在安全性等方面比MD5更受青睐,但是,如果我只是用一种方法来检查文件的完整性(也就是与密码加密等无关),使用SHA-256有什么优势吗?

由于MD5是128位而SHA-256是256位(因此大小是MD5的两倍)...

  1. 计算哈希值是否需要花费多达两倍的时间?

  2. 在时间不紧迫的情况下,比如备份程序中,只需要文件完整性,有人会反对使用MD5并提出其他算法,甚至建议使用不同的技术吗?

  3. 使用MD5是否会产生校验和?


52
术语挑剔:MD5和SHA-*都不会加密任何东西。它们是哈希函数。 - user395760
2
@delnan,其实我很高兴你注意到了这一点,谢谢。但是,哈希表示法不是加密吗? - Dave
18
首先,加密是可逆的(根据定义),而哈希函数是不可逆的(根据鸽笼原理)。 - user395760
1
嗯,这两者在根本上是不同的,因此,对其中一种的各种攻击甚至对另一种都没有意义,所以“更安全”在我看来并没有太多意义。您能否澄清一下您的意思? - user395760
1
嗯,它们确实是不同的,这意味着它们有不同的用途,因此受到的攻击方式也不同。对于哈希函数来说,最常见的攻击是产生碰撞,因为这是打败基于哈希的安全措施(例如哈希密码或签名证书)的方法。仅存储其哈希值并不能隐藏任何信息,因为这样会使其对所有人都无法访问,而不仅仅是对攻击者。 - user395760
显示剩余3条评论
7个回答

101

SHA256和MD5都是哈希算法。它们接收您的输入数据,即文件,然后输出一个256/128位的数字。这个数字是一个校验和。没有进行加密,因为无限数量的输入可以导致相同的哈希值,尽管在现实中发生碰撞的情况很少。

根据此答案,SHA256需要比MD5更多的时间来计算。

简单地说,我认为MD5可能适合您的需求。


1
谢谢,但作为一个离题的问题,您是在说加密必须产生一个类似于GUID的唯一“代码”/“ID”吗? - Dave
8
你要如何解密这条信息? - Paul Manta
@PaulManta - 我不知道,因为我只是出于诚信而这样做,我从未考虑过像这样的加密,但这很棒。谢谢。 - Dave
7
@Dave,我认为这个话题有些混淆,因为SHA被称为密码哈希。这意味着(我远非专家)你可以使用它来哈希密码。这样,如果攻击者获取了你的用户密码文件,他无法使用哈希值重建原始密码。加密则不同,它是可逆的。 - dandan78
@Dave,你在下面提到你正在寻找哈希函数列表。可以看看维基百科上的哈希函数文章:http://en.wikipedia.org/wiki/List_of_hash_functions - Rob
在对dotnet 6进行基准测试后,现在看来sha256比md5更快,因此这个答案已经过时了。 - Yossi Sternlicht

26
每个答案似乎都建议您使用安全哈希来完成工作,但所有这些哈希函数都被调整为缓慢运行,以迫使暴力攻击者拥有大量的计算能力,根据您的需求,这可能不是最佳解决方案。
有一些专门设计用于尽可能快速地哈希文件以检查完整性和比较的算法(如murmurXXhash等)。显然,这些算法并不是为了安全而设计的,因为它们不能满足安全哈希算法的要求(即随机性),但对于大消息具有低碰撞率。这些特性使它们在您不寻求安全性而是寻求速度时非常理想。
此类算法的示例和比较可以在这个出色的答案中找到:哪种哈希算法最适合独特性和速度?
例如,我们在我们的问答网站上使用murmur3来哈希用户上传的图片,因此即使用户在多个答案中上传相同的图片,我们也只存储一次。

24

对于1): 是的,在大多数CPU上,SHA-256的速度只有MD5的40%左右。

对于2): 我会为此情况提出不同于MD5的算法。我肯定更喜欢一个被认为是安全的算法。然而,这更多是一种感觉。这种情况比较构造,而不是现实的,例如,如果你的备份系统遇到基于MD5的证书攻击案例,你可能会碰到两个在示例中具有不同数据但相同MD5校验和的文件。对于其他情况,这并不重要,因为当被故意挑衅时,MD5校验和在虚拟上只有碰撞(=相同的校验和用于不同的数据)。 我不是关于各种哈希(校验生成)算法的专家,所以我不能建议另一个算法。因此,问题的这部分仍然是开放的。 建议进一步阅读维基百科上的加密哈希函数-文件或数据标识符。在该页面下面还有一个加密哈希算法列表。

对于3): MD5是一种计算校验和的算法。使用该算法计算的校验和称为MD5校验和。


12

基于 MD5 算法的校验已不再安全可靠。因此,当使用 md5sum 用于识别非安全相关文件中的已知文件时,可以很好地胜任。但是,如果文件可能被故意恶意篡改,则不能依赖其来检查文件完整性。在这种情况下,强烈建议使用新的哈希工具,如 sha256sum。

因此,如果您只是想检查文件损坏或文件差异,并且文件来源可信,则 MD5 应该足够了。 如果您要验证来自不受信任的源或通过未加密连接从可信源获取的文件的完整性,则 MD5 不足以保证其安全性。

还有一位评论者指出 Ubuntu 和其他系统仍在使用 MD5 校验和。Ubuntu 已经转向使用 PGP 和 SHA256 以及 MD5,但更强大的验证策略的文档难以找到。有关详细信息,请参阅 HowToSHA256SUM页面


1
我知道我来晚了,但感谢您提出这个观点!如果您正在使用校验和来验证攻击者是否篡改了您的文件,则MD5是一个糟糕的选择。如果攻击者知道他们在做什么,他们可以理论上找到正确的碰撞,从而使他们能够执行其代码而不更改文件的校验和,从而避开任何基于校验和的安全验证。SHA算法在现代CPU上表现良好,并且扩展性更好(随着文件大小的增加,我们的校验和也必须增加)。如果您处理大型高清视频文件,我建议使用SHA-512。 - Kris Craig

11
  1. 不,它比较慢但并不是非常慢。
  2. 对于备份程序来说,最好拥有比MD5更快的东西。

总的来说,我认为使用MD5加上文件名是绝对安全的。SHA-256 之所以更慢、更难处理是因为其大小。

你也可以使用比 MD5 不那么安全的算法而不会有任何问题。如果没有人试图攻击你的文件完整性,这也是安全的。


谢谢,但问题是我不知道还能用什么!我不是在寻求建议,我很乐意研究其他方法,但你能否提供除MD5/SHA256之外的建议? - Dave
1
取决于您使用的编程语言和运行时环境。 - Genesis Rock

7
  1. 大多数CPU上,SHA-256的速度比MD5慢2到3倍,但这不是因为它的哈希值更长。请参考其他答案以及这个Stack Overflow问题的答案。
  2. 以下是一个备份场景,MD5不适用:
    • 您的备份程序对每个正在备份的文件进行哈希。然后按其哈希值存储每个文件的数据,因此如果您备份相同的文件两次,则最终只会得到一份副本。
    • 攻击者可以让系统备份他们控制的文件。
    • 攻击者知道要从备份中删除的文件的MD5哈希值。
    • 攻击者随后可以利用MD5的已知弱点来创建一个具有与要删除的文件相同哈希值的新文件。当备份该文件时,它将替换要删除的文件,并且该文件的备份数据将丢失。
    • 该备份系统可以通过不替换其先前遇到哈希值的文件来加强(并使其更有效),但是攻击者可以通过预先备份具有相同哈希值的特殊构造虚假文件来防止备份具有已知哈希值的目标文件。
    • 显然,大多数系统,包括备份系统在内,都不满足使该攻击变得实际所需的条件,但我只是想举一个例子,说明SHA-256比MD5更可取的情况。是否适用于您正在创建的系统,取决于不仅仅是MD5和SHA-256的特性。
  3. 是的,像MD5和SHA-256生成的密码哈希值是一种校验和。

祝愉快哈希!


6

啊,你提供的链接还显示了其他算法。我猜我需要找出现在可用于.NET的哪些算法,并找到最快的那个。谢谢。 - Dave
3
此外,如果你搜索一些著名的网站,比如Sun、Ubuntu等,你可能会发现他们提供文件的MD5校验和以保证文件完整性。这可能会支持它在这些任务中的价值。 - SaidbakR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接