关于加密哈希函数的重点是什么?

时间:2009-06-24 13:25:02

标签: hash cryptography hash-function

我正在阅读关于MD5哈希值的this question,并且接受的答案让我感到困惑。据我所知,cryptopgraphic哈希函数的一个主要属性是找到具有相同哈希值的两个不同消息(输入)是不可行的。

但问题的共识答案为什么MD5哈希值不可逆?因为无限数量的输入字符串会产生相同的输出。这似乎是完全的与我相矛盾。

另外,令我困惑的是,算法是公开的,但哈希值仍然是不可逆的。这是因为散列函数中总是存在数据丢失,因此无法分辨哪些数据被丢弃了吗?

当输入数据大小小于固定输出数据大小时(例如,散列密码“abc”)会发生什么?

编辑:

好的,让我看看我是否有这句话:

  1. 确实很难推断哈希的输入,因为有无限量的输入字符串会产生相同的输出(不可逆属性)。
  2. 但是, 发现 ,即使是生成相同输出的多个输入字符串的单个实例也非常非常难(碰撞属性)。

6 个答案:

答案 0 :(得分:18)

警告:答案很长

我认为所有这些答案都缺少加密哈希函数的一个非常重要的特性:不仅无法计算散列的原始消息来获取给定的哈希值,而且无法计算任何将散列到给定哈希值的消息。这称为原像抗性

(通过“不可能” - 我的意思是没有人知道如何在比猜测每个可能的消息所花费的时间更短的时间内完成它,直到你猜到散列到哈希中的那个消息。)

(尽管人们普遍相信MD5的不安全性,MD5仍然可以抵抗preimage。任何不相信我的人都可以随意给我任何哈希值2aaddf751bff2121cc51dc709e866f19 .MD5没有的是 collision resistance ,这完全不同。)

现在,如果你不能在加密哈希函数中“向后工作”的唯一原因是因为哈希函数丢弃数据来创建哈希值,那么它就不能保证前映像素阻力:你仍然可以“向后工作”,并且只要在散列函数丢弃数据的任何地方插入随机数据,并且当您不想出原始消息时,您仍然会得到一条散列为所需散列值的消息。但你不能。

所以问题变成了:为什么不呢? (或者,换句话说,你如何使功能preimage抗性?)

答案是加密哈希函数模拟混沌系统。他们接受你的信息,把它分成块,混合这些块,让一些块相互交互,混合这些块,并重复那么多次(好吧,一个加密哈希函数做到这一点;其他人有他们的自己的方法)。由于块彼此交互,块C不仅必须与块D交互以产生块A,而且它必须与块E交互以产生块B.现在,当然,你可以找到块C,D的值, E会在你的哈希值中产生块A和B,但是当你往后走时,突然你需要一个与C交互的块F来制作D,并且用E来制作B,并且没有这样的块可以在同一时间!您必须猜到C,D和E的错误值。

虽然并非所有加密哈希函数都与上面描述的块交互完全相同,但它们也有相同的想法:如果你试图“向后工作”,你将会遇到很多死胡同,并且你尝试足够的值来生成一个preimage所需的时间大约是几百到几百万年(取决于散列函数),并不比只是尝试消息所需的时间要好得多,直到找到一个的工作原理。

答案 1 :(得分:12)

1:散列的主要目的是将非常大的空间映射到较小但仍然非常大的空间(例如,MD5,它将采用'任何'并将其转换为大小为2 ^ 128的空间 - 很大,但不像aleph-0那么大。)

除了其他功能外,良好的哈希值均匀填充目标空间。坏哈希以一种笨重的方式填充空间,为许多常见输入提供相同的哈希值。

想象一下这个愚蠢的哈希函数sum(),它只是添加了输入数字的所有数字:它成功地向下映射,但是有一堆冲突(具有相同输出的输入,如3和12和21)在输出空间的低端,空间的上端几乎是空的。因此,它使得空间使用非常差,容易破裂等。

因此,即使使用目标空间也会很难找到具有相同输出的两个输入,只需要几率:如果MD5是完美的,那么两个输入具有相同输出的几率将是2 ^ -128。这是相当不错的几率:你可以做到最好,而不需要求助于更大的输出空间。 (事实上​​,MD5并不完美,这是使其易受攻击的因素之一。)

但是大量的输入将映射到任何给定的散列仍然是正确的,因为输入空间是“无限的”,并且将无穷大除以2 ^ 128仍然会给你无限。

2:是的,散列总是会导致数据丢失,除非您的输出空间与输入空间相同或大于输入空间 - 在这种情况下您可能不需要散列!

3:对于较小的输入,最佳做法是对输入加盐。实际上,这对于任何加密哈希都是很好的做法,因为否则攻击者可以为您提供特定的输入并尝试找出您正在使用的哈希。 “Salt”只是您在输入中附加(或前置)的一组附加信息;然后哈希结果。

编辑:在密码学中,哈希函数抵抗前映像攻击也很重要,直观地说,即使知道许多其他输入/输出对,也难以猜测给定输出的输入。 “sum”函数可能很容易被猜到(但是因为它破坏数据仍然可能不容易反转)。

答案 2 :(得分:6)

您可能会感到困惑,因为the question you cite 的答案是令人困惑。 加密哈希函数的一个要求是它应该是抗图像的。也就是说,如果您知道MD5(x)但不知道消息x,则很难找到任何x'(等于x或与x不同),使得MD5(x')= MD5(x)。

抗原像素是一种不可逆的特性。如果给定y = f(x),则函数是可逆的,恰好有一个x适合(这是否容易)。例如,定义f(x)= x mod 10。 那么f是不可逆的。从f(x)= 7,你无法确定x是17,27还是别的。但f不具有前像抗性,因为很容易找到f(x)= 7的值x'。 x'= 17,27,12341237等都可以。

在进行加密时,您通常需要具有抗图像的功能(以及其他属性,如抗冲击性),而不仅仅是不可逆的功能。

答案 3 :(得分:2)

这些是哈希函数的一般属性。

但请注意,由于在其中发现了漏洞,因此不应再使用MD5。检查“漏洞”部分以及详细说明这些攻击的外部链接。 http://en.wikipedia.org/wiki/Md5您可以通过仅更改消息中的128位来进行MD5冲突。

SHA-1对于简单散列是安全的,尽管有一些攻击会使资金较少的实体(政府,大公司)受到影响

SHA-256是未来几十年对技术的安全起点。

答案 4 :(得分:1)

  

然而,对于“为什么MD5哈希值不可逆?”这个问题的共识答案呢?是因为“无限数量的输入字符串将产生相同的输出。”

对于任何哈希函数都是如此,但它不是加密哈希函数的本质。

对于诸如密码之类的短输入字符串,理论上可以反转加密散列函数,但它在计算上应该是不可行的。即你的计算运行时间太长而无用。

这种不可行性的原因是输入在哈希值中如此彻底地“混合在一起”,以至于无法以比计算所有输入的哈希值的暴力攻击更少的努力来解开它

答案 5 :(得分:0)

  

“为什么MD5哈希值不可逆?”是因为“无限数量的输入字符串>将生成相同的输出”

这就是无法反转哈希函数(获得相同输入)的原因。 加密哈希函数是抗冲突的,这意味着它也很难找到映射到相同输出的另一个输入值(如果你的哈希函数是mod 2:134 mod 2 = 0;现在你不能从134中取回134结果,但我们可以找到具有相同输出值的数字2(134和2碰撞))。

当输入小于块大小时,padding用于使其适合块大小。