哈希算法

  • 格式:wps
  • 大小:42.50 KB
  • 文档页数:7

哈希算法以及应用—MD5

10级数字媒体 杨国强

摘要:

Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的

输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,

该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小

于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一

的确定输入值。数学表述为:h = H(M) ,其中H( )--单向散列函数,M--任意

长度明文,h--固定长度散列值。MD5的全称是Message-Digest Algorithm 5(信

息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data

Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。

关键词:哈希算法;MD5

绪论

在信息安全领域中应用的Hash算法,还需要满足其他关键特性:

第一当然是单向性(one-way),从预映射,能够简单迅速的得到散列值,而在计

算上不可能构造一个预映射,使其散列结果等于某个特定的散列值,即构造相应

的M=H-1(h)不可行。这样,散列值就能在统计上唯一的表征输入值,因此,密

码学上的 Hash 又被称为"消息摘要(message digest)",就是要求能方便的将"

消息"进行"摘要",但在"摘要"中无法得到比"摘要"本身更多的关于"消息"的信

息。

第二是抗冲突性(collision-resistant),即在统计上无法产生2个散列值

相同的预映射。给定M,计算上无法找到M',满足H(M)=H(M') ,此谓弱抗冲突

性;计算上也难以寻找一对任意的M和M',使满足H(M)=H(M') ,此谓强抗冲突

性。要求"强抗冲突性"主要是为了防范所谓"生日攻击(birthday attack)",在

一个10人的团体中,你能找到和你生日相同的人的概率是2.4%,而在同一团体

中,有2人生日相同的概率是11.7%。类似的,当预映射的空间很大的情况下,

算法必须有足够的强度来保证不能轻易找到"相同生日"的人。

第三是映射分布均匀性和差分分布均匀性,散列结果中,为 0 的 bit 和

为 1 的 bit ,其总数应该大致相等;输入中一个 bit 的变化,散列结果中将

有一半以上的 bit 改变,这又叫做"雪崩效应(avalanche effect)";要实现使

散列结果中出现 1bit 的变化,则输入中至少有一半以上的 bit 必须发生变化。

其实质是必须使输入中每一个 bit 的信息,尽量均匀的反映到输出的每一个

bit 上去;输出中的每一个 bit,都是输入中尽可能多 bit 的信息一起作用的

结果。

哈希函数的应用

MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为

基础设计的。

1) MD4

MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message

Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32

位操作数的位操作来实现的。它的安全性不像RSA那样基于数学假设,尽管 Den

Boer、Bosselaers 和 Dobbertin 很快就用分析和差分成功的攻击了它3轮变换

中的 2 轮,证明了它并不像期望的那样安全,但它的整个算法并没有真正被破

解过,Rivest 也很快进行了改进。

下面是一些MD4散列结果的例子:

MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0

MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24

MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d

MD4 ("message digest") = d9130a8164549fe818874806e1c7014b

MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9

MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")

= 043f8582f241db351ce627e153e7f0e4

MD4

("1234567890123456789012345678901234567890123456789012345678901234567

8901234567890") = e33b4ddc9c38f2199c3e7b164fcc0536

2) MD5

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由

MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L.

Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用

数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度

的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得

一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或

少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器

做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和C

语言源代码在Internet RFCs 1321中有详细的描述

(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald

L. Rivest在1992年8月向IEFT提交。. .

Van Oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数

(Brute-Force Hash Function),而且他们猜测一个被设计专门用来搜索MD5

冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24

天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5

算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并

没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中

的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的

情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常

优秀的中间技术),MD5怎么都应该算得上是非常安全的了。

算法的应用

MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),

以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同

文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461这就是

tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过

其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播

这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者

下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时

就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果

再有一个第三方的认证机构,用MD5还可以防止文件作者的"抵赖",这就是所谓

的数字签名应用。

MD5还广泛用于加密和解密技术上。比如在UNIX系统中用户的密码就是以

MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系

统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行

比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密

码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密

码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的

难度。

正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被

称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符

串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5

值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8

位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列

组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天

文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前

提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的

应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要

原因。

算法描述

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每

一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四

个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果

等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即

N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填

充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,

在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步

的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的

整数倍。这样做的原因是为满足后面处理中对信息长度的要求。