Java实现MD5加密及解密的代码实例分享
基础:MessageDigest类的使用
其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:
/** *对字符串md5加密 * *@paramstr *@return */ importjava.security.MessageDigest; publicstaticStringgetMD5(Stringstr){ try{ //生成一个MD5加密计算摘要 MessageDigestmd=MessageDigest.getInstance("MD5"); //计算md5函数 md.update(str.getBytes()); //digest()最后确定返回md5hash值,返回值为8为字符串。因为md5hash值是16位的hex值,实际上就是8位的字符 //BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 returnnewBigInteger(1,md.digest()).toString(16); }catch(Exceptione){ thrownewSpeedException("MD5加密出现错误"); } }
进阶:加密及解密类
Java实现MD5加密以及解密类,附带测试类,具体见代码。
MD5加密解密类——MyMD5Util,代码如下
packagecom.zyg.security.md5; importjava.io.UnsupportedEncodingException; importjava.security.MessageDigest; importjava.security.NoSuchAlgorithmException; importjava.security.SecureRandom; importjava.util.Arrays; publicclassMyMD5Util{ privatestaticfinalStringHEX_NUMS_STR="0123456789ABCDEF"; privatestaticfinalIntegerSALT_LENGTH=12; /** *将16进制字符串转换成字节数组 *@paramhex *@return */ publicstaticbyte[]hexStringToByte(Stringhex){ intlen=(hex.length()/2); byte[]result=newbyte[len]; char[]hexChars=hex.toCharArray(); for(inti=0;i<len;i++){ intpos=i*2; result[i]=(byte)(HEX_NUMS_STR.indexOf(hexChars[pos])<<4 |HEX_NUMS_STR.indexOf(hexChars[pos+1])); } returnresult; } /** *将指定byte数组转换成16进制字符串 *@paramb *@return */ publicstaticStringbyteToHexString(byte[]b){ StringBufferhexString=newStringBuffer(); for(inti=0;i<b.length;i++){ Stringhex=Integer.toHexString(b[i]&0xFF); if(hex.length()==1){ hex='0'+hex; } hexString.append(hex.toUpperCase()); } returnhexString.toString(); } /** *验证口令是否合法 *@parampassword *@parampasswordInDb *@return *@throwsNoSuchAlgorithmException *@throwsUnsupportedEncodingException */ publicstaticbooleanvalidPassword(Stringpassword,StringpasswordInDb) throwsNoSuchAlgorithmException,UnsupportedEncodingException{ //将16进制字符串格式口令转换成字节数组 byte[]pwdInDb=hexStringToByte(passwordInDb); //声明盐变量 byte[]salt=newbyte[SALT_LENGTH]; //将盐从数据库中保存的口令字节数组中提取出来 System.arraycopy(pwdInDb,0,salt,0,SALT_LENGTH); //创建消息摘要对象 MessageDigestmd=MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); //将口令的数据传给消息摘要对象 md.update(password.getBytes("UTF-8")); //生成输入口令的消息摘要 byte[]digest=md.digest(); //声明一个保存数据库中口令消息摘要的变量 byte[]digestInDb=newbyte[pwdInDb.length-SALT_LENGTH]; //取得数据库中口令的消息摘要 System.arraycopy(pwdInDb,SALT_LENGTH,digestInDb,0,digestInDb.length); //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同 if(Arrays.equals(digest,digestInDb)){ //口令正确返回口令匹配消息 returntrue; }else{ //口令不正确返回口令不匹配消息 returnfalse; } } /** *获得加密后的16进制形式口令 *@parampassword *@return *@throwsNoSuchAlgorithmException *@throwsUnsupportedEncodingException */ publicstaticStringgetEncryptedPwd(Stringpassword) throwsNoSuchAlgorithmException,UnsupportedEncodingException{ //声明加密后的口令数组变量 byte[]pwd=null; //随机数生成器 SecureRandomrandom=newSecureRandom(); //声明盐数组变量 byte[]salt=newbyte[SALT_LENGTH]; //将随机数放入盐变量中 random.nextBytes(salt); //声明消息摘要对象 MessageDigestmd=null; //创建消息摘要 md=MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); //将口令的数据传给消息摘要对象 md.update(password.getBytes("UTF-8")); //获得消息摘要的字节数组 byte[]digest=md.digest(); //因为要在口令的字节数组中存放盐,所以加上盐的字节长度 pwd=newbyte[digest.length+SALT_LENGTH]; //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐 System.arraycopy(salt,0,pwd,0,SALT_LENGTH); //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节 System.arraycopy(digest,0,pwd,SALT_LENGTH,digest.length); //将字节数组格式加密后的口令转化为16进制字符串格式的口令 returnbyteToHexString(pwd); } }
测试类——Client,代码如下:
packagecom.zyg.security.md5; importjava.io.UnsupportedEncodingException; importjava.security.NoSuchAlgorithmException; importjava.util.HashMap; importjava.util.Map; publicclassClient{ privatestaticMapusers=newHashMap(); publicstaticvoidmain(String[]args){ StringuserName="zyg"; Stringpassword="123"; registerUser(userName,password); userName="changong"; password="456"; registerUser(userName,password); StringloginUserId="zyg"; Stringpwd="1232"; try{ if(loginValid(loginUserId,pwd)){ System.out.println("欢迎登陆!!!"); }else{ System.out.println("口令错误,请重新输入!!!"); } }catch(NoSuchAlgorithmExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } /** *注册用户 * *@paramuserName *@parampassword */ publicstaticvoidregisterUser(StringuserName,Stringpassword){ StringencryptedPwd=null; try{ encryptedPwd=MyMD5Util.getEncryptedPwd(password); users.put(userName,encryptedPwd); }catch(NoSuchAlgorithmExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(UnsupportedEncodingExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } /** *验证登陆 * *@paramuserName *@parampassword *@return *@throwsUnsupportedEncodingException *@throwsNoSuchAlgorithmException */ publicstaticbooleanloginValid(StringuserName,Stringpassword) throwsNoSuchAlgorithmException,UnsupportedEncodingException{ StringpwdInDb=(String)users.get(userName); if(null!=pwdInDb){//该用户存在 returnMyMD5Util.validPassword(password,pwdInDb); }else{ System.out.println("不存在该用户!!!"); returnfalse; } } }
PS:这里再为大家提供2款MD5加密工具,感兴趣的朋友可以参考一下:
MD5在线加密工具:
http://tools.jb51.net/password/CreateMD5Password
在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha