简单的MD5加密算法是无法达到绝对的安全的,普通的MD5加密算法有多种暴力破解方式,如果想要保证信息系统或者网站的安全,就需要对MD5加密算法进行改进,增强其安全性,下面我就来谈谈如何在MD5加密算法的基础上进行改进!

目前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) & WordToHex(c)),则表示是16位。例如对明文为“123456”的值进行加密,其md5值有两个,如下所示:

A=“123456”
password=md5(A)= 49ba59abbe56e057
password=md5(A)= e10adc3949ba59abbe56e057f20f883e

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

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′,则认为用户输入的密码跟数据库中的密码是匹配的。

虽然目前有很多诸如SQL注入、跨站攻击等攻击MD5加密算法的方法,可以较容易的获取数据库中的值,但通过本方法对MD5加密算法进行改进后,在网站或者系统代码泄露前,其数据是相对安全的。

小知识之MD5加密算法

MD5即Message-Digest Algorithm 5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。