专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »安全 » md5加密算法:一种基于Md5算法的改进加密思路方法 »正文

md5加密算法:一种基于Md5算法的改进加密思路方法

来源: 发布时间:星期六, 2009年9月12日 浏览:10次 评论:0
来源:51CTO.com

本文讨论了Md5加密算法在应用方面遇到些问题并且针对这种问题在基于Md5算法基础上改进了加密思路方法从而使用Md5加密口令方面更加安全

1.前言

Md5全称是Message-Digest Algorithm 5(信息-摘要算法)在90年代初由Mit Laboratory For Computer Science和Rsa Data Security IncRonaldl.rivest开发出来经md2、md3和md4发展而来作用是让大容量信息在用数字签名软件Software签署私人密钥前被“压缩”成种保密格式由于md5算法使用不需要支付任何版权费用所以在情况下md5也不失为种非常优秀加密算法被大量公司和个人广泛使用2004年8月17日美国加州圣巴巴拉国际密码学会议(Crypto’2004)上来自中国山东大学王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法报告公布了MD系列算法破解结果MD5破解工程权威网站WebSite(http://www.md5crk.com)也因此关闭从此宣布MD5加密算法不再是种安全加密算法

虽然王小云教授公布了破解MD5算法报告宣告该算法不再安全但是对于公司以及普通用户来说从算法上来破解MD5非常困难因此MD5仍然算是种安全算法

MD5是个安全散列算法输入两个区别明文不会得到相同输出值根据输出值不能得到原始明文即其过程不可逆;所以要解密MD5没有现成算法只能用穷举法把可能出现明文用MD5算法散列的后把得到散列值和原始数据形成映射表通过比在表中比破解密码MD5算法散列值通过匹配从映射表中找出破解密码所对应原始明文

对信息系统或者网站WebSite系统来说MD5算法主要用在用户注册口令加密对于普通强度口令加密可以通过以下 3种方式进行破解:

(1)在线查询密码些在线MD5值查询网站WebSite提供MD5密码值查询输入MD5密码值后如果在数据库中存在那么可以很快获取其密码值

(2)使用MD5破解工具网络上有许多针对MD5破解专用软件Software通过设置字典来进行破解

(3)通过社会工程学来获取或者重新设置用户口令

因此简单MD5加密是没有办法达到绝对安全普通MD5加密有多种暴力破解方式因此如果想要保证信息系统或者网站WebSite安全需要对MD5进行改造增强其安全性本文就是在MD5加密算法基础上进行改进!

2.Md5算法应用

2.1Md5加密原理

MD5以512位分组来处理输入信息且每分组又被划分为16个32位子分组经过了系列处理后算法输出由 4个32位分组组成将这 4个32位分组级联后将生成个128位散列值

在MD5算法中首先需要对信息进行填充使其字节长度对512求余数结果等于448因此信息字节长度(Bits Length)将被扩展至N*512+448即N*64+56个字节(Bytes)N为个正整数填充思路方法如下在信息后面填充个1和无数个0直到满足上面条件时才停止用0对信息填充然后再在这个结果后面附加个以64位 2进制表示填充前信息长度经过这两步处理现在信息字节长度=N*512+448+64=(N+1)*512即长度恰好是512整数倍数这样做原因是为满足后面处理中对信息长度要求MD5中有 4个32位被称作链接变量(Chaining Variable)整数参数他们分别为:A=0x01234567B=0x89abcdefC=0xfedcba98D=0x76543210 当设置好这 4个链接变量后就开始进入算法 4轮循环运算循环次数是信息中512位信息分组数目

将上面 4个链接变量复制到另外 4个变量中:A到aB到bC到cD到d 主循环有 4轮(MD4只有 3轮)每轮循环都很相似轮进行16次操作每次操作对a、b、c和d中其中 3个作次非线性运算然后将所得结果加上第 4个变量(文本中个子分组和个常数)

再将所得结果向右环移个不定并加上a、b、c或d中的最后用该结果取代a、b、c或d中的下是每次操作中用到 4个非线性(每轮个)

F(X,Y,Z)=(X∧Y)∨(( X)∧Z)
G(X,Y,Z)=(X∧Z)∨(Y∧( Z))
H(X,Y,Z)=X⊕Y⊕Z
I(X,Y,Z)=Y⊕(X∨( Z))





其中⊕是异或∧是和∨是或 是反符号

如果X、Y和Z对应位是独立和均匀那么结果位也应是独立和均匀F是个逐位运算如果X那么Y否则ZH是逐位奇偶操作符所有这些完成的后将ABCD分别加上abcd然后用下分组数据继续运行算法最后输出是ABC和D级联最后得到ABCD就是输出结果A是低位D为高位DCBA组成128位输出结果

2.2 MD5安全性

从安全角度讲MD5输出为128位若采用纯强力攻击寻找个消息具有给定Hash值计算困难性为2128用每秒可试验1000000000个消息计算机需时1.07×1022年若采用生日攻击法寻找有相同Hash值两个消息需要试验264个消息用每秒可试验1000000000个消息计算机需时585年

2.3 Md5加密算法应用

MD5加密算法由于其具有较好安全性加的商业也可以免费使用该算法因此该加密算法被广泛使用md5算法主要运用在数字签名、文件完整性验证以及口令加密等方面




3.改进后加密思路方法

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

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







如果将加密md5值直接保存在数据库当网站WebSite存在注入或者其它漏洞时入侵者极有可能获取用户密码值通过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.关键代码和实现

本文提及改进思路方法关键实现代码如下:

[!--# file="md5.asp"--] [ Function GetRandomizeCode(digit) Randomize Dim m_strRandArray,m_Randlen,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_Randlen = digit ''定义随机码长度 for i = 1 to m_Randlen m_strRandomize = m_strRandomize & m_strRandArray(Int((21*Rnd))) next GetRandomizeCode = l(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 ]

注:用时将第换成< >第 2组换成<% %>





实现效果如图1所示需要加密时直接encrypt_password即可

可以看到第 3位至第 9位为随机填充数随机填充数为“462hjk”

4.讨论和结束语

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



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: