哈希算法
- 格式: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的
整数倍。这样做的原因是为满足后面处理中对信息长度的要求。