|
发表于 2008-11-4 20:28:34
|
显示全部楼层
3.改进后的加密方法
3.1目前md5加密方法利用的缺陷
在目前的信息系统中,对md5加密方法的利用主要通过在脚本页面中引用包含md5加密函数代码的文件,以asp脚本为例,在需要调用的页面中加入处理 SSI 文件时出错
,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值有两个,如下所示:
A=“123456”password=md5(A)= 49ba59abbe56e057 password=md5(A)= e10adc3949ba59abbe56e057f20f883e
如果将加密的md5值直接保存在数据库,当网站存在注入或者其它漏洞时,入侵者极有可能获取用户的密码值,通过md5在线查询或者暴力破解可以得到密码。
3.2基于md5算法的改进加密方法
本文提到的方法是在使用md5加密算法对明文(口令)加密的基础上,对密文进行了改变,在密文中截取一段数据并丢弃,然后使用随机函数填充被丢弃的数据,且整个过程不改变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_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′,则认为用户输入的密码跟数据库中的密码是匹配的。
3.关键代码与实现
本文提及改进方法关键实现代码如下:
[!--#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
]
注:用时将第一组[]换成< >,第二组[]换成。
实现效果如图1所示,需要加密时直接调用encrypt_password函数即可。
图1
从图1中可以看到第三位至第九位为随机填充数,随机填充数为“462hjk”。
4.讨论与结束语
有人也曾经提出对md5加密算法中的函数或者变量进行修改,从而加强在使用原md5算法的安全,但是这种方法修改了md5原函数或者变量后,无法验证修改后md5算法在强度上是否跟原算法一致。本文提出的方法是在原有md5加密的基础上,通过对密文截取一定位数的字符串,并使用随机数进行填充,最后得到的密文虽然是经过md5加密,但是其值已经大不一样,因此通过md5常规破解方法是永远也不能破解其原始密码值,从而保证了数据的安全。虽然目前有很多攻击方法,诸如SQL注入、跨站攻击等,可以较容易的获取数据库中的值,通过本方法进行加密,在网站或者系统代码泄露前,其数据是相对安全的,因此具有一定参考加值。 |
-
|