《一种基于Md5算法的改进加密方法》由会员分享,可在线阅读,更多相关《一种基于Md5算法的改进加密方法(6页珍藏版)》请在金锄头文库上搜索。
1、1.前言Md5 的全称是 Message-Digest Algorithm 5(信息- 摘要算法),在 90 年代初由 Mit Laboratory For Computer Science 和 Rsa Data Security Inc 的 Ronaldl.rivest 开发出来,经 md2、md3 和md4 发展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被“ 压缩”成一种保密的格式。由于 md5 算法的使用不需要支付任何版权费用的,所以在一般的情况下,md5 也不失为一种非常优秀的加密算法,被大量公司和个人广泛使用。2004 年 8 月 17 日的美国加州圣巴巴拉的国际密码
2、学会议(Crypto2004)上,来自中国山东大学的王小云教授做了破译 MD5、HAVAL-128、 MD4 和RIPEMD 算法的报告,公布了 MD 系列算法的破解结果,MD5 破解工程权威网站(http:/)也因此关闭,从此宣布 MD5 加密算法不再是一种安全的加密算法。虽然王小云教授公布了破解 MD5 算法的报告,宣告该算法不再安全,但是对于公司以及普通用户来说,从算法上来破解 MD5 非常困难,因此 MD5 仍然算是一种安全的算法。MD5 是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密 MD5 没有现成的算法,只
3、能用穷举法,把可能出现的明文,用MD5 算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的 MD5 算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。对信息系统或者网站系统来说,MD5 算法主要用在用户注册口令的加密,对于普通强度的口令加密,可以通过以下三种方式进行破解:(1)在线查询密码。一些在线的 MD5 值查询网站提供 MD5 密码值的查询,输入 MD5 密码值后,如果在数据库中存在,那么可以很快获取其密码值。(2)使用 MD5 破解工具。网络上有许多针对 MD5 破解的专用软件,通过设置字典来进行破解。(3)通过社会工程学来获取或者重新设
4、置用户的口令。因此简单的 MD5 加密是没有办法达到绝对的安全的,因为普通的 MD5 加密有多种暴力破解方式,因此如果想要保证信息系统或者网站的安全,需要对 MD5 进行改造,增强其安全性,本文就是在 MD5 加密算法的基础上进行改进!2.Md5 算法应用2.1Md5 加密原理MD5 以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个 32 位分组组成,将这四个 32 位分组级联后将生成一个 128 位散列值。在 MD5 算法中,首先需要对信息进行填充,使其字节长度对 512 求余数的结果等于 448。因此,信息的字节长度
5、(Bits Length)将被扩展至 N*512+448,即 N*64+56 个字节(Bytes ),N 为一个正整数。填充的方法如下,在信息的后面填充一个 1 和无数个 0,直到满足上面的条件时才停止用 0 对信息的填充。然后再在这个结果后面附加一个以 64 位二进制表示的填充前的信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是 512 的整数倍数。这样做的原因是为满足后面处理中对信息长度的要求。MD5 中有四个 32 位被称作链接变量( Chaining Variable)的整数参数,他们分别为:A=001234567 ,B=089
6、abcdef ,C=0xfedcba98 ,D=076543210。 当设置好这四个链接变量后,就开始进入算法的四轮循环运算,循环的次数是信息中 512 位信息分组的数目。将上面四个链接变量复制到另外四个变量中:A 到 a,B 到 b,C 到 c,D 到 d。 主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行 16 次操作。每次操作对 a、b、c 和 d 中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量(文本中的一个子分组和一个常数)。再将所得结果向右环移一个不定的数,并加上 a、b、c 或 d 中之一。最后用该结果取代 a、b、c 或 d 中之一。 以一下是每次操作
7、中用到的四个非线性函数(每轮一个)。F(X,Y,Z)=(XY)( X)Z)G(X,Y,Z)=(XZ)(Y( Z)H(X,Y,Z)=XYZI(X,Y,Z)=Y(X( Z)其中,是异或,是与,是或, 是反符号。如果 X、Y 和 Z 的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F 是一个逐位运算的函数。即,如果 X,那么 Y,否则 Z。函数 H 是逐位奇偶操作符。所有这些完成之后,将 A,B,C,D分别加上 a,b ,c ,d。然后用下一分组数据继续运行算法,最后的输出是 A,B,C 和 D 的级联。最后得到的 A,B,C ,D 就是输出结果,A 是低位,D 为高位,DCBA 组成
8、128 位输出结果。2.2 MD5 的安全性从安全的角度讲,MD5 的输出为 128 位,若采用纯强力攻击寻找一个消息具有给定 Hash 值的计算困难性为 2128,用每秒可试验 1000000000 个消息的计算机需时 1.071022 年。若采用生日攻击法,寻找有相同 Hash 值的两个消息需要试验 264 个消息,用每秒可试验 1000000000 个消息的计算机需时585 年。2.3 Md5 加密算法的应用MD5 加密算法由于其具有较好的安全性,加之商业也可以免费使用该算法,因此该加密算法被广泛使用,md5 算法主要运用在数字签名、文件完整性验证以及口令加密等方面。3.改进后的加密方法
9、3.1 目前 md5 加密方法利用的缺陷在目前的信息系统中,对 md5 加密方法的利用主要通过在脚本页面中引用包含 md5 加密函数代码的文件,以 asp 脚本为例,在需要调用的页面中加入,md5.asp 为 md5 加密函数代码文件,然后直接调用函数 MD5(sMessage)即可,md5 加密后的值有 16 位和 32 位之分,如果在 md5 加密函数中使用的是MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d),则表示是 32 位,如果使用的是 MD5=LCase(WordToHex(b) & Word
10、ToHex(c),则表示是 16 位。例如对明文为“123456” 的值进行加密,其 md5 值有两个,如下所示:A=“123456”password=md5(A)= 49ba59abbe56e057password=md5(A)= e10adc3949ba59abbe56e057f20f883e如果将加密的 md5 值直接保存在数据库,当网站存在注入或者其它漏洞时,入侵者极有可能获取用户的密码值,通过 md5 在线查询或者暴力破解可以得到密码。3.2 基于 md5 算法的改进加密方法本文提到的方法是在使用 md5 加密算法对明文(口令)加密的基础上,对密文进行了改变,在密文中截取一段数据并丢
11、弃,然后使用随机函数填充被丢弃的数据,且整个过程不改变 md5 加密后的位数。其加密过程用算法描述如下:(1)对明文 password 进行 md5 加密,获得密文 md5(password)。(2)使用截取函数截取加密后的密文,从第 beginnumber 位置开始截取 number 位数值,得到密码A,其中 A=left(md5(password),beginnumber-1)。(3)使用截取函数截取加密后的明文的 number 位数后的值 B,其中 B=right(md5(password),md5-digit -(beginnumber+number-1)。(4)使用随机函数 gen_
12、key(number)填充被截取的 number 的值。(5)变换后的密码值为 encrypt_password =A&get_key(number)&B变量说明:password:客户端提交的原始密码encrypt_password:经过处理后的密码beginnumber:对原始密码开始截取的位置(0number:对密码截取位数(0md5-digit:md5 取 16位或者 32 位值解密过程跟加密过程有些类似,先对输入的明文进行加密,接着从 beginnumber 处截取前半部分得到A,后半部分得到 B,然后从数据库中读出密码中的 A 和 B 部分,最后如果 A=A并且 B=B,则认为用户
13、输入的密码跟数据库中的密码是匹配的。3.关键代码与实现本文提及改进方法关键实现代码如下:!-#include file=md5.asp-Function GetRandomizeCode(digit) RandomizeDim m_strRandArray,m_intRandlen,m_strRandomize,im_strRandArray = Array(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z)m_intRandlen = digit 定义随机码的长度for i = 1 to m_int
14、Randlenm_strRandomize = m_strRandomize & m_strRandArray(Int(21*Rnd)nextGetRandomizeCode = lcase(m_strRandomize)End FunctionFunction encrypt_password(beginnumber,number,password,md5_digit)A=left(md5(password),beginnumber-1)B=Right(md5(password),md5_digit-(beginnumber+number-1)C=GetRandomizeCode(numbe
15、r)D=A&C&Bencrypt_password=dEnd Function注:用时将第一组换成,第二组换成。实现效果如图 1 所示,需要加密时直接调用 encrypt_password 函数即可。图 1 实现效果从图 1 中可以看到第三位至第九位为随机填充数,随机填充数为“462hjk”。4.讨论与结束语有人也曾经提出对 md5 加密算法中的函数或者变量进行修改,从而加强在使用原 md5 算法的安全,但是这种方法修改了 md5 原函数或者变量后,无法验证修改后 md5 算法在强度上是否跟原算法一致。本文提出的方法是在原有 md5 加密的基础上,通过对密文截取一定位数的字符串,并使用随机数进行填充,最后得到的密文虽然是经过 md5 加密,但是其值已经大不一样,因此通过 md5 常规破解方法是永远也不能破解其原始密码值,从而保证了数据的安全。虽然目前有很多攻击方法,诸如 SQL 注入、跨站攻击等,可以较容易的获取数据库中的值,通过本方法进行加密,在网站或者系统代码泄露前,其数据是相对安全的,因此具有一定参考加值