MD5加密算法与JAVA技术的融合不仅能应用于整个Java体系的WEB开发领域,而且可广泛应用于对数据有较高安全性要求的数字签名、电子商务、数据处理等领域。具有开发周期短、一次开发多处应用、可跨平台使用、运行效率高等的绝对优势。那么我今天就给大家介绍一下基于JAVA技术的MD5加密算法是如何实现的。

一、MD5加密算法描述

MD5加密算法可简述为:以512位分组来处理输入字节串的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由4个32位分组组成,将这4个32位分组级联后将生成一个128位散列值。

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

将4个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。主循环有四轮,每轮循环都很相似。第一轮进行16次操作,每次操作对a、b、c和d中的其中3个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一,最后用该结果取代a、b、c或d中之一,每次操作中用到的四个非线性函数(每轮一个)分别为F(X,Y,Z)=X&Y|NOT(X)&Z;G(X,Y,Z)=X&Z|Y&NOT(Z);H(X,Y,Z)=XxorYxorZ;I(X,Y,Z)=Yxor(X|NOT(Z));其中如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的,F是一个逐位运算的函数,即,如果X,那么Y,否则Z,函数H是逐位奇偶操作符。

_二、JSP和JavaBean

JSP是基于Java体系的WEB开发技术,用于创建跨平台及跨服务器的动态网页,与CGI、ASP、PHP等相比,它具有组件和网页设计从逻辑上分离、良好的扩展性和安全性、一次编写,到处运行、强调可重用的组件等优点。

JavaBean是一种可重用Java组件,它通过封装业务逻辑成为功能对象,实现被JavaApplet/Servelet/JSP等Java程序的调用,是目前功能强大及开发简单的最好的组件方式。

如果将一些繁琐或者常用的动作,撰写于Bean内,可以达到简化和优化JSP网页结构的目的。如果已有实现某种功能的JavaBean,则创建包含这个功能的Web页面只需要实例化它,再用HTML表格将它定位即可。

三、基于JAVA技术的MD5加密算法的实现

1、 实现方案

为充分利用JSP的动态页面优势和JavaBean的组件优势,实现方案采取用Java实现MD5加密算法,并用JavaBean封装,利用JSP展现的方式。既保证了一次编写到处运行0又体现了Java2在比较密集的计算中的高效率。

_2、MD5的JavaBean

{inti,index,partLen;

byte[]block=newbyte[64];

index=(int)(count[0]4443)&0x3F;

if((count[0]+=(inputLen333))3(inputLen333))count[1]++;

count[1]+=(inputLen44429);

partLen=642index;

if(inputLen4=partLen)

{md5Memcpy(buffer,inbuf,index,0,partLen);

md5Transform(buffer);

for(i=partLen;

i+633inputLen;

i+=64){md5Memcpy(block,inbuf,0,i,64);

md5Transform(block);}

index=0;}

elsei=0;

md5Memcpy(buffer,inbuf,index,i,inputLen2i);}

privatevoidmd5Transform(byteblock[])

MD5核心变换程序

{longa=state[0],b=state[1],c=state[2],d=state[3];long[]x=newlong[16];

Decode(x,block,64);/*Round1*/

a=FF(a,b,c,d,x[0],S11,0xd76aa478L);/*1*/

d=FF(d,a,b,c,x[1],S12,0xe8c7b756L);/*2*/

c=FF(c,d,a,b,x[2],S13,0x242070dbL);/*3*/

b=FF(b,c,d,a,x[3],S14,0xc1bdceeeL);/*4*/

a=FF(a,b,c,d,x[4],S11,0xf57c0fafL);/*5*/

d=FF(d,a,b,c,x[5],S12,0x4787c62aL);/*6*/

c=FF(c,d,a,b,x[6],S13,0xa8304613L);/*7*/

b=FF(b,c,d,a,x[7],S14,0xfd469501L);/*8*/

a=FF(a,b,c,d,x[8],S11,0x698098d8L);/*9*/

d=FF(d,a,b,c,x[9],S12,0x8b44f7afL);/*10*/

c=FF(c,d,a,b,x[10],S13,0xffff5bb1L);/*11*/

b=FF(b,c,d,a,x[11],S14,0x895cd7beL);/*12*/

a=FF(a,b,c,d,x[12],S11,0x6b901122L);/*13*/

d=FF(d,a,b,c,x[13],S12,0xfd987193L);/*14*/

c=FF(c,d,a,b,x[14],S13,0xa679438eL);/*15*/

b=FF(b,c,d,a,x[15],S14,0x49b40821L);/*16*/

3、 JSP中调用JavaBean

使用这个Bean只需要在JSP应用程序的WEB-INF/classes下建立一个beartool目录,然后将上述JavaBean程序编译得到的MD5。class拷贝到这个目录下,在需要使用MD5加密算法加密的JSP页面中使用3jsp:useBeanid=.oMD5.scope=.request.class=.beartool.MD5./4就可实现MD5JavaBean的调用。其中id为建立Bean的实例时用的实例变量名。

随着Internet技术的不断发展,Web应用正逐步走向电子商务和企业级应用,其复杂性、动态性、安全性要求更高,分离处理逻辑显示方式的JSP,便于封装复用的JavaBean组件为Java技术的Web应用开发提供了优秀的解决方案,并具有强扩展性、易收缩性等优势。利用JSP和JavaBean技术实现的MD5加密算法,既充分体现了Java/一次编写,到处运行0的技术优势,又大幅增强数据安全性,必将在Web应用领域发挥重要作用,具有广泛的应用前景。

小知识之MD5加密算法

MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。