SHA1 是否比 MD5 更好,只是因为它生成 160 位的哈希?

信息安全 密码学 哈希 md5
2021-09-06 07:15:28

众所周知,SHA1 比 MD5 更推荐用于散列,因为 MD5 实际上被破坏了,因为已经发现了很多冲突。使用生日攻击,可能会在 MD5 中以 2 64复杂度和SHA1 中以 2 80复杂度发生碰撞

众所周知,有一些算法能够在比生日攻击更短的时间内破解这两者。

我的问题是:MD5 是否仅仅因为容易产生冲突而被认为是不安全的?因为看两者,在 SHA1 中产生冲突也不是那么困难。那么是什么让 SHA1 变得更好呢?

更新 02/2017 - https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html

4个回答

产生 SHA-1 冲突并不是那么容易。在 SHA-1 上描述的攻击实际上以 2 61的平均成本有效,这似乎是合理的,比一般的生日攻击(在 2 80中)快得多,但仍然相当困难(可行,但昂贵)。

话虽如此,我们并不真正知道是什么使哈希函数具有抵抗力(例如,请参阅this answer进行详细讨论)。通过大量的挥手,我可以声称 SHA-1 比 MD5 更健壮,因为它有更多的轮次,并且因为 SHA-1 中 80 个消息词的推导比 MD5 更“混合”(在特别是 1 位旋转,顺便说一下,这是 SHA-0 和 SHA-1 之间的唯一区别,并且已经产生了 SHA-0 冲突)。

对于更多相同的内容,请查看 SHA-256,它更加“庞大”(比 SHA-1 更多的操作,但具有相似的结构),并且目前没有中断。就好像对于给定的结构,散列函数的安全操作最少(但我正在以惊人的速度移动我的手,所以不要相信我说了什么真正科学或深刻的东西)。

不,不仅仅是输出的长度。它们针对密码分析攻击的安全级别存在显着差异。

对 MD5 有毁灭性的碰撞攻击。关于 MD5 的 Wikipedia 文章有一些详细信息。)这些攻击意味着 MD5 基本上没有提供针对冲突的安全性:在 MD5 中很容易找到冲突。

相比之下,SHA1 似乎更安全。虽然有一些已知的针对 SHA1 的攻击,但它们远没有针对 MD5 的攻击严重。关于 SHA1 的 Wikipedia 文章有一个概述。)因此,在许多设置中,SHA1 是比 MD5 更好的选择。

如今,您最好不要使用 MD5 或 SHA1,而是使用更现代的哈希函数之一,例如 SHA256。这些没有任何实际相关的已知攻击。

但是绝对不要在任何需要防碰撞的环境中使用 MD5,因为 MD5 的这方面完全被破坏了。

散列函数提供的安全级别基于生成将产生给定散列签名(散列输出)的纯文本的难度。散列是一种简化一组数据的快速方法,以指示用户拥有原始数据而无需实际泄露数据。这对于验证某人是他们所说的人(通过将您知道他们知道的东西的哈希值与存储的值进行比较)以及验证消息没有被更改都非常有用。因为散列是多对一的(许多值会产生相同的散列值),理论上很难从散列到原始值。由于大量可能的哈希值,应该很难获得一个哈希来产生一个给定的输出。

然而,不幸的是,这并不总是正确的。某些值对应于人类可读输入的期望允许称为彩虹表的字典攻击针对散列来尝试发现原始值。加盐(在输入的开头或结尾添加非人类可读的输入)是为了防止彩虹表工作,因为必须为每种不同的盐制作彩虹表。

另一个问题,与您的问题相关的是哈希冲突。每当两个给定的输入产生相同的哈希输出时,就会发生哈希冲突。为了验证数据未被更改,必须不容易为更改的数据集生成与原始散列匹配的散列。不幸的是,MD5 在这方面受到了彻底的破坏,因为有多种方法可以相对容易地找到可以放在有效负载末尾或开头的更改,以使其看起来有效。SHA-1 在这方面也有一些最近发现的小妥协,但是它们没有 MD5 问题那么严重。使用 SHA256 之类的东西更加安全,因为它目前没有任何已知的针对哈希冲突的攻击。

这是MD5和SHA1的比较。您可以清楚地了解哪个更好。

在此处输入图像描述