哈希算法的强度

6

我注意到以下事情:

MD5已经被破解用于碰撞,不再具有密码学安全性;请使用SHA-1。SHA-1已经被破解用于碰撞,不再具有密码学安全性;请使用SHA-2。

根据我的理解,从数据 d 获取特定哈希值 h(d) 的机会对于所有哈希结果都是相等的。这意味着,哈希算法的唯一加强机制是返回更长的哈希值。

这也意味着,在不考虑哈希结果长度的情况下,所有哈希值都同样容易受到暴力破解攻击,而且“密码学上被破解”只是指比暴力搜索更快的攻击方式。

这是真的吗?现代密码哈希算法采取了哪些措施来防止碰撞攻击?

6个回答

11

"X哈希函数被破解"这个说法意味着哈希函数算法存在缺陷,使得碰撞比暴力破解更快地生成。参考Bruce Schneier的这篇文章 - 他说SHA-1碰撞现在可以更快地生成,仅此而已。

因此,是的,它们都同样不安全于暴力破解,但这并不是"X哈希函数被破解"的声明所涉及的内容。


9
确切地说,对于哈希函数 h,有三种可以执行的“攻击”:
  1. 预像攻击:给定一个“输出” y(正确大小的比特序列,例如 MD5 的 128 比特),找到一个消息 m(任意比特序列)使得 h(m) = y

  2. 第二预像攻击:给定一个消息 m,找到另一个消息 m',并且与 m 不同,使得 h(m) = h(m')

  3. 碰撞攻击:找到两条消息 mm',它们彼此不同,并且满足 h(m) = h(m')

一种好的哈希函数是一种在最佳情况下能够抵御这三种攻击的函数。那么这个最佳情况是什么呢?它取决于哈希输出大小 n

考虑一种理论上完美的哈希函数,由一个黑盒组成;在盒子里有一个小矮人、一些骰子和一本大书。当询问一个给定输入消息的哈希值时,小矮人使用骰子生成一个随机输出,并将其返回。但他还会在他的大书中写入消息和输出。如果再次询问相同消息的哈希值,那么他将会返回先前的相同值。这个设置被理论家称为一个 随机预言机。随机预言机从不自相矛盾,但在精确问题(和输入消息)被问到之前,您无法知道它将对给定问题回答什么。

如果随机预言机输出长度为 n 比特的字符串,则可以在时间 O(2n) 内找到预像和第二预像,在时间 O(2n/2) 内找到碰撞。这里所说的时间是以请求随机预言机为基础的。抵御预像攻击很容易理解:攻击者只需尝试消息,直到纯粹的运气使预言机输出期望值;他无法做得更好,因为即使小矮人也不知道他会得到任何新输入的信息。由于预言机的均匀随机性质,期望尝试次数为 2n。 对于第二预像攻击的抵御同理。对于碰撞,这与所谓的 生日悖论 有关。

如果哈希函数的抵抗力似乎与随机预言机的抵抗一致,那么它就被认为是安全的。 它不能更好;我们要求它也不会更糟。

当某人提出一种方法来寻找预像、第二预像或与随机神谕上的通用方法成功率更高的碰撞时,哈希函数就被称为“破解”。SHA-1被认为已经被破解,因为发现了一种成本约为2^61的寻找碰撞的方法(SHA-1具有160位输出,因此应该抵抗工作因子约为2^80的碰撞)。请注意,完整的方法未运行,即我们没有实际的碰撞。2^61仍然非常高,在可行范围内(需要数千台机器,运行数月或数年)。但是2^61比2^80小五十万倍,所以这是一个突破。
有时,“破解”是以荒谬的代价发现的(例如,理论抵抗力为2^168的代价为2^112的攻击)。我们称之为“学术性”突破:比预期的抵抗力快,但仍然可以通过地球技术完全撤消。
请注意,并非所有哈希函数的用途都依赖于抵抗碰撞。实际上,大多数用途都依赖于抵抗预像或第二预像。对于那些攻击,SHA-1目前像新的一样好,具有2^160的抵抗力。
相反,即使是具有128位输出的完美哈希函数也应被视为弱点,至少对于碰撞抵抗:通用攻击,工作因子为2^64,处于技术可行范围之内。这就是为什么新的哈希标准使用更大的输出(例如,SHA-2从224位输出开始)。足够大的输出可以击败通用攻击。

非常好的解释(+1)。我有一个疑问。当说“asdasd....”是“how are you”的sha1指纹时,这并不意味着“how are you”是唯一可以生成哈希值“asdasd....”的字符串,对吗?如果是这样,为什么数字证书中被称为指纹(因为指纹是唯一的)? - Ashwin
当我们说“4bfe46a...”是“how are you”的指纹时,我们的意思是“how are you”是唯一已知的字符串,可以生成哈希值“4bfe46a...”。高度预期有许多其他字符串会产生相同的哈希值,但实际上找到一个将是第二个映像,因此非常难以做到(这将需要大量的计算能力,甚至更多的运气)。它是指纹的意义在于“难以伪造”。 - Thomas Pornin

3

2

MD5不是抗碰撞的。维基百科的定义如下:

抗碰撞是密码哈希函数的一个属性:如果一个哈希函数很难找到两个输入的输出相同,也就是说,两个输入a和b,H(a)= H(b),则该哈希函数是抗碰撞的。

MD5生成一个128位的哈希值,现在可以在几秒钟内破解。

现代加密哈希算法采用什么措施来防止碰撞攻击?

一种预防方法是增加哈希结果(以位为单位的输出大小)。这允许密码学家有足够的时间来研究漏洞。我已经做了很久没有做过了……但是总之就是这样。


1

我只有部分回答。=)

根据我的当前理解,从数据d获得某个哈希值h(d)的概率对于所有哈希结果都是相等的。

这不是正确的。哈希的目的是每次针对某些特定数据d获得相同的哈希值h(d)。因此,算法可能没有任何“机会”生成哈希。哈希算法面临的困境是,从d计算h(d)应该很容易,但从h(d)计算出一个有效的d应该很难。

如果可以比暴力更快地计算出h(d)中的d,则算法被认为是“不具有密码学安全性”的。

很容易看出,并非所有哈希算法都必须同样不安全,只需采用返回d的前几位的哈希函数即可。无论取多少位,找到碰撞都是微不足道的。


我认为原帖的作者知道这一点。也许措辞不够准确,但意图显然是说所有哈希输出的可能性都是相等的。 - Nick Johnson
所有输出被生成的概率相等,这并不难理解。 - Nick Johnson
@Jens:假设你有数据d,你将要对其进行哈希。如果没有特定的哈希函数内部知识,你能说出h(d)的值吗?只有在使用优秀的哈希函数时,哈希输出范围内的所有值才是等可能的。同样地,如果你已经对d进行了哈希,然后改变了某个位置上的单个位来创建d',那么h(d')应该同样有可能是任何输出值(包括h(d))。只有当你对d的值域具有非常具体的洞见时(例如连续或可减少到哈希输出的范围类似),这种随机性才能得到改善。 - Tony Delroy
@Tony: 我具有概率论背景,因此在涉及这些术语时可能有点过于挑剔。但我仍然认为,创建“随机”输出不是哈希函数的重点。哈希函数应该为典型输入值分布创建均匀的值(用于数据存储,如字典),或者是陷门函数(用于加密)。在两种情况下,所有随机性都存在于输入数据中,而不是哈希函数中。(位更改的属性是哈希成为陷门的结果,而不是仅仅是可取的特性) - Jens
@Jens:计算机科学专业的同学们都知道,术语是有差异的。我同意哈希表的哈希函数应该创建一个均匀分布;你对输入的典型分布的限定在一般情况下是正确的,但是在这里,一个伟大的通用哈希函数必须处理任何合法输入的分布,并且对于任何值的#桶和#不同的哈希输出值都要表现良好。这需要将每个输入映射到一个有效的“随机”但一致的元素,就像Thomas Pornin的答案中的小矮人掷骰子以获得连续的“随机”值一样。你能想到一个实际的替代方案吗? - Tony Delroy

1

是的,“密码学上破解”确切地意味着这个。恐怕我不是专家,所以无法回答第二个问题。


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