一种基于Md5算法的改进加密方法

上一篇 / 下一篇  2008-11-05 08:06:22

本文讨论了Md5加密算法应用方面遇到的一些问题,并且针对这种问题在基于Md5算法的基础上改进了加密方法,从而使用Md5加密口令方面更加安全IXPUB技术博客&NhRVr1i[b

3c~} \(tJ(G01.前言IXPUB技术博客 o a!Y3zq3V2bs
IXPUB技术博客6e^ ~^ k-] ^
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日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果,MD5破解工程权威网站(http://www.md5crk.com)也因此关闭,从此宣布MD5加密算法不再是一种安全的加密算法。IXPUB技术博客`/c(}I \'DS^0w L'r ~

m ^1g/n%{j)D0虽然王小云教授公布了破解MD5算法的报告,宣告该算法不再安全,但是对于公司以及普通用户来说,从算法上来破解MD5非常困难,因此MD5仍然算是一种安全的算法。
)]l f `U$gTC$z0
g$cpFWv)]0MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。IXPUB技术博客;tgs&N j+l
IXPUB技术博客_xMlETD
对信息系统或者网站系统来说,MD5算法主要用在用户注册口令的加密,对于普通强度的口令加密,可以通过以下三种方式进行破解:IXPUB技术博客 ph-St'j~

HB8t!N:Ot'rr)z0(1)在线查询密码。一些在线的MD5值查询网站提供MD5密码值的查询,输入MD5密码值后,如果在数据库中存在,那么可以很快获取其密码值。
RIZ:Ud8p0
YXe1bI L5b @1M0(2)使用MD5破解工具。网络上有许多针对MD5破解的专用软件,通过设置字典来进行破解。
U:v:J0D8je}PZ0
J[:|ha"F ~0(3)通过社会工程学来获取或者重新设置用户的口令。
1V$MRMPb0IXPUB技术博客hLBNFj-AJ z
因此简单的MD5加密是没有办法达到绝对的安全的,因为普通的MD5加密有多种暴力破解方式,因此如果想要保证信息系统或者网站的安全,需要对MD5进行改造,增强其安全性,本文就是在MD5加密算法的基础上进行改进!IXPUB技术博客+pi9id9^"R5j M

+B3xLU[#E)W8w02.Md5算法应用
f7s;@1cR8V0
1jQ6OoN/l02.1Md5加密原理
UV?iv D S,B0IXPUB技术博客l-{Q0D2z \+u
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
|0Ai9PrBc)uKY*O0IXPUB技术博客#e m/{LDsbVS
在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的整数倍数。这样做的原因是为满足后面处理中对信息长度的要求。MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 当设置好这四个链接变量后,就开始进入算法的四轮循环运算,循环的次数是信息中512位信息分组的数目。
aO)Rn.]NErkY.C0IXPUB技术博客7o [(Zw||5s
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。 主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量(文本中的一个子分组和一个常数)。IXPUB技术博客1XfD0jJTV
IXPUB技术博客PHr#|O6l/QX
再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。 以一下是每次操作中用到的四个非线性函数(每轮一个)。 IXPUB技术博客:\*Bd:_(_}B

P0y3M;G?)J9w \!@0F(X,Y,Z)=(X∧Y)∨(( X)∧Z)G(X,Y,Z)=(X∧Z)∨(Y∧( Z))H(X,Y,Z)=X⊕Y⊕ZI(X,Y,Z)=Y⊕(X∨( Z))IXPUB技术博客 K0w:t|[ FNB&f2^
 IXPUB技术博客k#L&|dz s-G
IXPUB技术博客As1z?7Jz
其中,⊕是异或,∧是与,∨是或, 是反符号。IXPUB技术博客1olGd [:G*D0z3H!?f
IXPUB技术博客 Ac;V7qNKsl
如果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组成128位输出结果。
!L/M(C6C X d:Wn[0IXPUB技术博客AcBw j d#BI5U
2.2 MD5的安全性
%f'HTTn1J p0F0IXPUB技术博客7lsC.S;dK
从安全的角度讲,MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2128,用每秒可试验1000000000个消息的计算机需时1.07×1022年。若采用生日攻击法,寻找有相同Hash值的两个消息需要试验264个消息,用每秒可试验1000000000个消息的计算机需时585年。IXPUB技术博客-L VVrbS w

'f.\,do D'N6t9~8L0q02.3 Md5加密算法的应用
OwQ`h)FJ.n n^;o0
6Z4m Y/G%s ^)I0MD5加密算法由于其具有较好的安全性,加之商业也可以免费使用该算法,因此该加密算法被广泛使用,md5算法主要运用在数字签名、文件完整性验证以及口令加密等方面。IXPUB技术博客JC;v N8dE0{E

+PGa)L&E!H03.改进后的加密方法IXPUB技术博客 x)mb@J.aZ

%ik_e5v3n~2^]03.1目前md5加密方法利用的缺陷IXPUB技术博客:fBy { G8VJ2Xs

IXPUB技术博客IE{8^u$W

在目前的信息系统中,对md5加密方法的利用主要通过在脚本页面中引用包含md5加密函数代码的文件,以asp脚本为例,在需要调用的页面中加入处理 SSI 文件时出错
V6Jv,N2CA3A@z+y\0,md5.asp为md5加密函数代码文件,然后直接调用函数MD5(sMessage)即可,md5加密后的值有16位和32位之分,如果在md5加密函数中使用的是MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)),则表示是32位,如果使用的是MD5=LCase(WordToHex(b) & WordToHex(c)),则表示是16位。例如对明文为“123456”的值进行加密,其md5值有两个,如下所示:IXPUB技术博客+wa&G0fj

,aT,@ sb8|0A=“123456”IXPUB技术博客'M5Mi4i!na3]{sN
password=md5(A)= 49ba59abbe56e057IXPUB技术博客7Ds:\W| m
password=md5(A)= e10adc3949ba59abbe56e057f20f883e

'z1n8Q*T0Z"|0
IXPUB技术博客BEA.Usn+Qh2j H

如果将加密的md5值直接保存在数据库,当网站存在注入或者其它漏洞时,入侵者极有可能获取用户的密码值,通过md5在线查询或者暴力破解可以得到密码。

(b&tdP#WF0

Y$bD!xAaJQwu03.2基于md5算法的改进加密方法

k R1] YM{^D;uo0

BJ ];p*s/B"W4h L(A]0本文提到的方法是在使用md5加密算法对明文(口令)加密的基础上,对密文进行了改变,在密文中截取一段数据并丢弃,然后使用随机函数填充被丢弃的数据,且整个过程不改变md5加密后的位数。其加密过程用算法描述如下:IXPUB技术博客r0qPb7P(W:^ V+O j

IXPUB技术博客{6q8X+k8X7[:]k

(1)对明文password进行md5加密,获得密文md5(password)。IXPUB技术博客1d^:^{)P3n

IXPUB技术博客`7c J9?`)j:I9T S+B

(2)使用截取函数截取加密后的密文,从第beginnumber位置开始截取number位数值,得到密码A,其中A=left(md5(password),beginnumber-1)。

)K:z j/u |z a0

o0?-xeo0(3)使用截取函数截取加密后的明文的number位数后的值B,其中 B=right(md5(password),md5-digit -(beginnumber+number-1))。IXPUB技术博客-h8A"\S;~J;GZ

L+j ~{K'jR0(4)使用随机函数gen_key(number)填充被截取的number的值。

N]~*i;S5xj0IXPUB技术博客 {5` @d?'}

(5)变换后的密码值为encrypt_password =A&get_key(number)&B

g;L}%Zo0IXPUB技术博客)v%t,u-V6L [0\Y

变量说明:

i ccW o-S9X'Ko`/y0
IXPUB技术博客q&gO^|

password:客户端提交的原始密码
]m:Uf)xUc s0encrypt_password:经过处理后的密码
ma6E6i$L8f&L4f2zP0beginnumber:对原始密码开始截取的位置(0IXPUB技术博客iC*Qks
number:对密码截取位数(0IXPUB技术博客^d*F#lb P%oG
md5-digit:md5取16位或者32位值IXPUB技术博客{7Xre.cT"Wr

IXPUB技术博客U;x3Dxo;`ev

解密过程跟加密过程有些类似,先对输入的明文进行加密,接着从beginnumber处截取前半部分得到A′,后半部分得到B′,然后从数据库中读出密码中的A和B部分,最后如果A=A′并且B=B′,则认为用户输入的密码跟数据库中的密码是匹配的。

co*M8O;p&O` Q/|4hH0IXPUB技术博客m5` D:jL)UF"n

3.关键代码与实现

r6w/y/M? o,{"k1r0IXPUB技术博客GI&@l t0@

本文提及改进方法关键实现代码如下:IXPUB技术博客k:Z*];y6X-xy

[!--#include file="md5.asp"--]
[
Function GetRandomizeCode(digit)
 Randomize
 Dim m_strRandArray,m_intRandlen,m_strRandomize,i
 m_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_intRandlen
  m_strRandomize = m_strRandomize & m_strRandArray(Int((21*Rnd)))
 next
 GetRandomizeCode = lcase(m_strRandomize)
End Function  
Function encrypt_password(beginnumber,number,password,md5_digit)
 A=left(md5(password),beginnumber-1)
 B=Right(md5(password),md5_digit-(beginnumber+number-1))
 C=GetRandomizeCode(number)
 D=A&C&B
 encrypt_password=d
End Function
]
注:用时将第一组[]换成< >,第二组[]换成<% %>。
IXPUB技术博客UI.LUs2Wl Y

实现效果如图1所示,需要加密时直接调用encrypt_password函数即可。IXPUB技术博客[tc'~.s?

IXPUB技术博客'W.U!|B2~x c{/Al6j

 
图1 实现效果

Q2x`1b:l0IXPUB技术博客-SXo tw;M+ze

从图1中可以看到第三位至第九位为随机填充数,随机填充数为“462hjk”。IXPUB技术博客,r'SC!fg1^]5o0ZW(X)Q

IXPUB技术博客9Ve8l*`.x f?k2U+x

4.讨论与结束语

P5w*q1X7AIX0IXPUB技术博客#e}2J0B9e'W["w4^

有人也曾经提出对md5加密算法中的函数或者变量进行修改,从而加强在使用原md5算法的安全,但是这种方法修改了md5原函数或者变量后,无法验证修改后md5算法在强度上是否跟原算法一致。本文提出的方法是在原有md5加密的基础上,通过对密文截取一定位数的字符串,并使用随机数进行填充,最后得到的密文虽然是经过md5加密,但是其值已经大不一样,因此通过md5常规破解方法是永远也不能破解其原始密码值,从而保证了数据的安全。虽然目前有很多攻击方法,诸如SQL注入、跨站攻击等,可以较容易的获取数据库中的值,通过本方法进行加密,在网站或者系统代码泄露前,其数据是相对安全的,因此具有一定参考加值。

b!tr7HllS!S,M0

TAG: 改进 算法

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar