您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > 在JSP中如何实现MD5加密的方法
在JSP中如何实现MD5加密的方法这篇文章主要介绍了在JSP中如何实现MD5加密的方法,较为详细的分析了JSP采用MD5加密的功能、特点及实现技巧,具有一定参考借鉴价值,在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍在JSP中如何实现MD5加密的方法,希望能抛砖引玉。(一)消息摘要简介一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。消息摘要是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1。消息摘要有两个基本属性:两个不同的报文难以生成相同的摘要难以对指定的摘要生成一个报文,而可以由该报文反推算出该指定的摘要。Java源码importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;publicclassMD5Digest{privateMessageDigest__md5=null;privateStringBuffer__digestBuffer=null;publicMD5Digest()throwsNoSuchAlgorithmException{__md5=MessageDigest.getInstance(MD5);__digestBuffer=newStringBuffer();}publicStringmd5crypt(Strings){__digestBuffer.setLength(0);byteabyte0[]=__md5.digest(s.getBytes());for(inti=0;iabyte0.length;i++)__digestBuffer.append(toHex(abyte0[i]));return__digestBuffer.toString();}publicStringtoHex(byteone){StringHEX=0123456789ABCDEF;char[]result=newchar[2];result[0]=HEX.charAt((one&0xf0)4);result[1]=HEX.charAt(one&0x0f);Stringmm=newString(result);returnmm;}}/************************************************MD5算法的JavaBean@author:TopcatTuppinLastModified:10,Mar,2001*************************************************/packagebeartool;importjava.lang.reflect.*;/*************************************************md5类实现了RSADataSecurity,Inc.在提交给IETF的RFC1321中的MD5message-digest算法。*************************************************/publicclassMD5{/*下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define实现的,这里把它们实现成为staticfinal是表示了只读,切能在同一个进程空间内的多个Instance间共享*/staticfinalintS11=7;staticfinalintS12=12;staticfinalintS13=17;staticfinalintS14=22;staticfinalintS21=5;staticfinalintS22=9;staticfinalintS23=14;staticfinalintS24=20;staticfinalintS31=4;staticfinalintS32=11;staticfinalintS33=16;staticfinalintS34=23;staticfinalintS41=6;staticfinalintS42=10;staticfinalintS43=15;staticfinalintS44=21;staticfinalbyte[]PADDING={-128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};/*下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中被定义到MD5_CTX结构中*/privatelong[]state=newlong[4];//state(ABCD)privatelong[]count=newlong[2];//numberofbits,modulo2^64(lsbfirst)privatebyte[]buffer=newbyte[64];//inputbuffer/*digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的16进制ASCII表示.*/publicStringdigestHexStr;/*digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.*/privatebyte[]digest=newbyte[16];/*getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.*/publicStringgetMD5ofStr(Stringinbuf){md5Init();md5Update(inbuf.getBytes(),inbuf.length());md5Final();digestHexStr=;for(inti=0;i16;i++){digestHexStr+=byteHEX(digest[i]);}returndigestHexStr;}//这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数publicMD5(){md5Init();return;}/*md5Init是一个初始化函数,初始化核心变量,装入标准的幻数*/privatevoidmd5Init(){count[0]=0L;count[1]=0L;///*Loadmagicinitializationconstants.state[0]=0x67452301L;state[1]=0xefcdab89L;state[2]=0x98badcfeL;state[3]=0x10325476L;return;}/*F,G,H,I是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们实现成了private方法,名字保持了原来C中的。*/privatelongF(longx,longy,longz){return(x&y)|((~x)&z);}privatelongG(longx,longy,longz){return(x&z)|(y&(~z));}privatelongH(longx,longy,longz){returnx^y^z;}privatelongI(longx,longy,longz){returny^(x|(~z));}/*FF,GG,HH和II将调用F,G,H,I进行近一步变换FF,GG,HH,andIItransformationsforrounds1,2,3,and4.Rotationisseparatefromadditiontopreventrecomputation.*/privatelongFF(longa,longb,longc,longd,longx,longs,longac){a+=F(b,c,d)+x+ac;a=((int)as)|((int)a(32-s));a+=b;returna;}privatelongGG(longa,longb,longc,longd,longx,longs,longac){a+=G(b,c,d)+x+ac;a=((int)as)|((int)a(32-s));a+=b;returna;}privatelongHH(longa,longb,longc,longd,longx,longs,longac){a+=H(b,c,d)+x+ac;a=((int)as)|((int)a(32-s));a+=b;returna;}privatelongII(longa,longb,longc,longd,longx,longs,longac){a+=I(b,c,d)+x+ac;a=((int)as)|((int)a(32-s));a+=b;returna;}/*md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的*/privatevoidmd5Update(byte[]inbuf,intinputLen){inti,index,partLen;byte[]block=newbyte[64];index=(int)(count[0]3)&0x3F;///*Updatenumberofbits*/if((count[0]+=(inputLen3))(inputLen3))count[1]++;count[1]+=(inputLen29);partLen=64-index;//Transformasmanytimesaspossible.if(inputLen=partLen){md5Memcpy(buffer,inbuf,index,0,partLen);md5Transform(buffer);for(i=partLen;i+63inputLen;i+=64){md5Memcpy(block,inbuf,0,i,64);md5Transform(block);}index=0;}elsei=0;///*Bufferremaininginput*/md5Memcpy(buffer,inbuf,index,i,inputLen-i);}/*md5Final整理和填写输出结果*/privatevoidmd5Final(){byte[]bits=newbyte[8];intindex,padLen;///*Savenumberofbits*/Encode(bits,count,8);///*Padoutto56mod64.index=(int)(count[0]3)&0x3f;padLen=(index56)?(56-index):(120-index);md5Update(PADDING,padLen);///*Appendlength(beforepadding)*/md5Update(bits,8);///*Storestateindigest*/Encode(digest,state,16);}/*md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的字节拷贝到output的outpos位置开始*/privatevoidmd5Memcpy(byte[]output,byte[]input,
本文标题:在JSP中如何实现MD5加密的方法
链接地址:https://www.777doc.com/doc-2561599 .html