哈希函数在密码学中的应用

  • 本文出自 AC.HASH 团队,AC<=>Adaptive Creator,适应性创作者,旨在于能够在未来新领域下创造出新的哈希算法以应对未来局面。
  • 产出本文的成员:
    • 中原工学院大二在校生(昵称:莫凡)
  • 我们在OpenHarmony成长计划啃论文俱乐部里,通过啃论文方式学习hash技术

Table of Contents

      • 什么是哈希函数?
      • 什么是birthday attack?
      • 哈希值的长度如何影响安全性?
      • 什么是压缩函数?
      • 什么是冲突(pseudo-collisions)?
      • 什么是MD2、MD4和MD5?
      • 什么是安全哈希算法(SHA和 SHA-1)?
      • 还有哪些其他哈希函数?
      • 参考资料


什么是哈希函数?

一个哈希函数 H H H是一个变换,取一个可变大小的输入 m m m,返回一个固定大小的字符串,称为哈希值 h h h( 即 h = H ( m ) h = H ( m ) h=H(m))。具有这种性质的哈希函数具有多种通用的计算用途,但在密码学中使用时,通常选择哈希函数具有一些附加性质。

一个密码哈希函数的基本要求是:

输入可以是任意长度的,
输出具有固定长度,
H ( x ) H(x) H(x)对于任意给定的 x x x相对容易计算,
H ( x ) H(x) H(x)是单向的,
H ( x ) H(x) H(x)是无碰撞的。

一个哈希函数 H H H据说是单向的,如果很难求逆,其中‘很难求逆’是指给定一个哈希值 h h h,在计算上很难找到一些输入 x x x使得 H ( x ) = h H ( x ) = h H(x)=h

如果给定一个消息 x x x,在计算上不可能找到一个不等于 x x x的消息 y y y使得 H ( x ) = H ( y ) H ( x ) = H ( y ) H(x)=H(y),则称 H H H是一个弱无碰撞哈希函数。

一个强的无碰撞哈希函数 H H H,它在计算上不可行地找到任意两个消息 x x x y y y使得 H ( x ) = H ( y ) H ( x ) = H ( y ) H(x)=H(y)

哈希值简明地表示计算它的较长消息或文档;可以把一个消息摘要看作较大文档的‘数字指纹’。著名哈希函数的例子有MD2和MD5(see here)以及SHA(see here)。

也许加密哈希函数的主要作用在于提供数字签名。由于哈希函数一般比数字签名算法要快,因此,
在文档的哈希值上,通过计算签名来计算某些文档的数字签名是经典的,与文档本身相比,哈希值很小。此外,一个信息摘要可以公开,而不需要揭示其来源的文献内容。这在数字时间戳(see here)中很重要,因为使用哈希函数,可以在不向时间戳服务透露文档内容的情况下得到时间戳。


什么是birthday attack?

birthday attack是用来指一类暴力攻击的名称。它从惊人的结果中得到它的名字,即23人一组中的两个或两个以上的人共享同一个生日的概率大于 1 2 \frac{1}{2} 21;这样的结果被称为生日悖论(birthday paradox)。

如果某种函数,当供给一个随机输入时,返回 k k k个古典概型值中的一个,那么通过对不同输入的函数反复评估,我们期望在约 1.2 k 1 2 1.2k^{\frac{1}{2}} 1.2k21获得相同的输出。对于上述生日悖论,用365替换k。

birthday attack常被用来发现哈希函数的碰撞。


哈希值的长度如何影响安全性?

哈希函数的基本密码属性是它既是单向的,也是无冲突的。我们可以对哈希函数进行的最基本的攻击是随机地选择输入到哈希函数中,直到我们找到一些输入能够得到我们正在寻找的目标输出值( 从而与单向属性相矛盾 ),或者找到两个产生相同输出的输入( 从而与无碰撞属性相矛盾 )。

假设哈希函数产生一个 n n n位长的输出。如果我们试图找到一些能产生某种目标输出值y的输入,那么由于每一个输出都是同样可能的,我们期望要尝试 2 n 2^{n} 2n个可能的输入值。

如果我们试图找到一个冲突,那么根据生日悖论,我们会预期在尝试了 2 n 2 2^{\frac{n}{2}} 22n可能的输入值之后,我们会发生一些冲突。Van Oorschot 和Wiener 展示了如何实施这种残酷的力量攻击。

关于在提供数字签名时使用哈希函数,Yuval 基于生日悖论提出了以下策略,其中n为消息摘要的长度:
1.攻击者选择Alice很可能要签名的无害目标消息。
2.攻击者生成 2 n 2 2^{\frac{n}{2}} 22n个无害消息( 例如 ,做一些小的编辑修改 )的变体,所有这些变体都传达相同的含义 和 它们对应的信息摘要。然后,他生成要替换的目标消息的相等数量的变化。
3.根据生日悖论,无害消息的变化之一与目标消息的变化之一匹配的概率大于 1 2 \frac{1}{2} 21
4.攻击者然后在无害消息的变化上获得Alice的签名。
5.从无害消息中取出签名,并附加到产生相同消息摘要的目标消息的变体中。被攻击者在没有运用加密密钥的情况下成功伪造了消息。
6.为了避免依赖于蛮力方法的攻击,哈希函数的输出必须足够长。


什么是压缩函数?

Damg�rd 和 Merkle 定义过一个哈希函数被称为所谓的压缩函数,极大地影响了密码哈希函数的设计。压缩函数取固定长度的输入,返回较短的、固定长度的输出。然后可以通过压缩函数的重复应用来定义一个哈希函数,直到整个信息被处理完。在这个过程中,一个任意长度的信息根据压缩函数被分割成一定长度的块,并进行"填充(padded)" (出于安全原因),使得信息的大小是块大小的倍数。然后对这些块进行顺序处理,将迄今为止的哈希结果和当前的信息块作为输入,最终输出为信息的哈希值。


什么是冲突(pseudo-collisions)?

冲突是位于迭代哈希函数核心的压缩函数的碰撞。哈希函数的压缩函数的碰撞在构造哈希函数本身的碰撞时可能是有用的,但通常情况并非如此。虽然冲突可能被视为哈希函数的不幸属性,但一个伪冲突(pseudo-collision)并不等同于碰撞,哈希函数仍然可以是安全的。MD5 是一个哈希函数的例子,伪碰撞已经被发现,但是仍然被认为是安全的。


什么是MD2、MD4和MD5?

MD2、MD4和MD5是Rivest开发的信息摘要算法。它们是针对数字签名应用而言的,在一个大的消息被用私钥签名之前,必须以安全的方式‘压缩’。这三种算法都接收任意长度的消息,并生成128位消息摘要。虽然这些算法的结构有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。三种算法的描述和源代码可以在Internet RFCs 1319 - 1321找到。

MD2由Rivest于1989年开发。信息首先被填充(数据部位),使其字节长度是16的倍数。然后在信息末尾追加一个16字节的校验和,并在这个新产生的信息上计算哈希值。Rogier和Chauvaud发现,如果省略校验和的计算,MD2的碰撞可以被构造出来。这是MD2已知的唯一的密码分析结果。

MD4是Rivest于1990年开发的。对信息进行填充,保证信息在加上448后的长度可以被512整除。然后将信息原始长度的64位二进制表示添加到信息中。该消息在Damg�rd / Merkle迭代结构中以512位块进行处理,每个块以三个不同的步骤进行处理。Den Boer和Bosselaers等人非常迅速地开发了对MD4版本的攻击,其中第一轮或最后一轮丢失。Dobbertin 已经在一个典型的PC机上显示了如何在一分钟内就能发现MD4全版本的碰撞。显然,现在MD4被认为是被打破了。

MD5由Rivest于1991年开发。它在md4的基础上增加了"安全-带子"(safety-belts)的概念,虽然比MD4稍慢,但更安全。该算法由4个截然不同的步骤组成,其设计与MD4略有不同。信息摘要大小以及填充要求保持不变。Den Boer和Bosselaers 发现了MD5的伪碰撞,但没有其他已知的密码分析结果。

Van Oorschot 和 Wiener在哈希函数中考虑了对碰撞的粗暴力搜索,他们估计专门为MD5设计的碰撞搜索机(1994年耗资 1000万美元)可以在平均每24天内找到一个MD5的碰撞。一般的技术可以应用于其他哈希函数。


什么是安全哈希算法(SHA和 SHA-1)?

安全哈希标准(SHS)中规定的算法——安全哈希算法(SHA)由NIST开发,并作为联邦信息处理标准( FIPS PUB 180 )出版。SHA-1是对1994年出版的SHA的修订。修订纠正了SHA中一个未发表的缺陷。它的设计与Rivest开发的MD4哈希函数族非常相似。

该算法取长度小于 2 64 2^{64} 264位的消息,产生160位的信息摘要。该算法比MD5稍慢,但较大的信息摘要使其更安全地抵抗蛮力碰撞(brute-force collision)和反转攻击(inversion attacks)。


还有哪些其他哈希函数?

为了在这里作一个简要的概述,我们注意到哈希函数往往根据其设计分为三类:
围绕分组密码构建的哈希函数(those built around block ciphers),使用模块化算术的哈希函数(those built around block ciphers,),以及那些具有所谓的“专用”设计的哈希函数(those which have what is termed a “dedicated” design)。

通过在分组密码周围构建哈希函数,意在通过使用DES(数据加密标准)等信任良好的分组密码可以获得安全和信任良好的哈希函数。所谓Davies-Meyer哈希函数就是一个围绕DES的使用而构建的哈希函数的例子。

在第二类哈希函数中使用模块算术是为了在哈希函数与同样使用模块算术的数字签名算法一起使用时节省实现成本。遗憾的是,从安全角度来看,这类哈希函数的跟踪记录并不好,在这第二类中也没有哈希函数可以推荐。

第三类中的哈希函数,有了它们所谓的‘专用’设计,往往速度很快,相对于那些围绕使用一个分组密码而设计的算法,给出了相当大的优势。与MD5和SHA-1一样,RIPE-MD 和 HAVAL是专用的哈希函数,也具有类似MD4的设计。


参考资料

http://x5.net/faqs/crypto/

你可能感兴趣的:(hash,算法,数据结构,散列表)