本章概要
MD5消息摘要算法
MD5
出生日期:1992年公开
发明人:罗纳德·李维斯特
算法简介
是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值hash value 用于确保信息传输的完整一致性 在RFC 1321中被加以规范 1992年8月,罗纳德·李维斯特向ietf提交了一份重要文件,描述了算法的原理,由于md5算法的公开性和安全性,在90年代被广泛使用在各种程序语言中,确保资料传递安全无误
产生基础
将数据(比如一段文字)运算编程另一固定长度值,是散列算法的基础原理 输入不定长度信息,输出固定长度128位,经过程序流程,生成四个32位数据,最后联合起来成为一个128位散列,基本生成方式是:求余,取余,调整长度,与链接变量进行循环运算
存在隐患
1996年被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,建议使用其他算法,比如SHA-1 2004年,证实MD5算法无法防止碰撞,因此无法适用于安全性认证,比如SSL公开密钥认证或是 数字签名等用途 2009年,谢涛和冯登国仅用了2exp(20.96)的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟
MD5散列
一般128位的MD5散列被表示为32位16进制数字,举例:
应用
MD5已经广泛使用在为文件传输提供一定的可靠性方面。例如,服务器预先提供一个MD5校验和,用户下载完文件以后,用MD5算法计算下载文件的MD5校验和,然后通过检查这两个校验和是否一致,就能判断下载的文件是否出错 MD5亦有应用于部分网上赌场以保证赌博的公平性,原理是系统先在玩家下注前已生成该局的结果,将该结果的字符串配合一组随机字符串利用MD5 加密,将该加密字符串于玩家下注前便显示给玩家,再在结果开出后将未加密的字符串显示给玩家,玩家便可利用MD5工具加密验证该字符串是否吻合 例子: 在玩家下注骰宝前,赌场便先决定该局结果,假设生成的随机结果为4、5、 6大,赌场便会先利用MD5 加密“4, 5, 6”此字符串并于玩家下注前告诉玩家;由于赌场是无法预计玩家会下什么注,所以便能确保赌场不能作弊;当玩家下注完毕后,赌场便告诉玩家该原始字符串,即“4, 5, 6”,玩家便可利用MD5工具加密该字符串是否与下注前的加密字符串吻合。 该字符串一般会加上一组随机字符串 (Random string),以防止玩家利用碰撞 (Collision) 解密字符串,但如使用超级电脑利用碰撞亦有可能从加上随机字符串的加密字符串中获取游戏结果。随机字符串的长度与碰撞的次数成正比关系,一般网上赌场使用的随机字符串是长于20字,有些网上赌场的随机字符串更长达500字,以增加解密难度