Java实现MD5加密解密类收藏
转载请注明:来自http://b lo g.c sdn.net/M_ChangGong/作者:张燕广Java实现MD5加密以及解密类 附带测试类具体见代码。
MD5加密解密类——MyMD5Util,代码如下view plaincopy to clipboardprint?
01.p ackage c om.zyg.s ecurity.md5;
02.
03.imp ort java.io.UnsupportedEnc odingExc eption;
04.import java.security.Mes sageDigest;
05.imp ort java.s ecurity.No SuchAlgorithmExc eption;
06.import java.security.S ecureRandom;
07.import java.util.Arrays;
08.
09.public class MyMD5Util {
10.
11. private static final StringHEX_NUMS_S TR="0123456789ABC DEF";
12. private static final Integer SALT_LENGTH=12;
13.
14. /**
15. *将16进制字符串转换成字节数组
16. *@p aram hex
17. *@return
18. */
19. public static byte[]hexStringToByte(String hex) {
20. int len=(hex.le ngth() /2);
21. byte[]result=new byte[len];
22. c har[]hexChars=hex.toCharArray();
23. for(int i=0; i<len; i++) {
24. intpos=i*2;
25. re s ult[i] = (b yte)(HEX_NUMS_STR.ind exO f(he xChars[p os])<<4
26. |HEX_NUMS_S TR.indexO f(hexChars[p os+1]));
27. }
28. return result;
29. }
30.
31.
32. /**
33. *将指定byte数组转换成16进制字符串
34. *@param b
35. *@return
36. */
37. public static String byteToHexString(byte[]b) {
38. S tring Buffer hexS tr in g=new S trin gBuffer();
39. for(int i=0; i<b.length; i++) {
40. S tring hex=Inte ger.to HexS tring(b[i]&0xF F);
41. if(he x.leng th()==1) {
42. hex='0'+hex;
43. }
44. hexS trin g.ap p end(hex.to Up p erC as e());
45. }
46. return hexString.to String();
47. }
48.
49. /**
50. *验证口令是否合法
51. *@param password
52. *@param passwordInDb
53. *@return
54. *@throws No S uc hAlgorithmExc ep tion
55. *@throws UnsupportedEnc odingExc eption
56. */
57. public static boolean validPassword(String password, Stringp as s wo rdInDb)
58. throws NoSuchAlgorithmException,UnsupportedEnc odingExc eption{
59. //将16进制字符串格式口令转换成字节数组
60. b yte[]p wdInDb=hexS tringTo Byte(p as s wo rdInDb);
61. //声明盐变量
62. b yte[] s alt=new b yte[S ALT_LENGTH];
63. //将盐从数据库中保存的口令字节数组中提取出来
64. S ys tem.arrayc o p y(p wd InDb,0, s alt,0,S ALT_LENG T H);
65. //创建消息摘要对象
66. Mess ageD ig es t md=Mess ageD iges t.getIns tanc e("MD 5");
67. //将盐数据传入消息摘要对象
68. md.up d ate(s alt);
69. //将口令的数据传给消息摘要对象
70. md.up date(p as s wo rd.getBytes("UTF-8"));
71. //生成输入口令的消息摘要
72. byte[]digest=md.digest();
73. //声明一个保存数据库中口令消息摘要的变量
74. byte[] digestInDb = new byte[pwdInDb.length -S ALT_LENG T H];
75. //取得数据库中口令的消息摘要
76. S ys tem.arrayc o p y(p wd InDb, S ALT_LENG T H, d ige s tInDb,0,dige s tInDb.leng th);
77. //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同
78. if(Arr ays.equals(diges t,diges tInDb)) {
79. //口令正确返回口令匹配消息
80. return true;
81. } els e {
82. //口令不正确返回口令不匹配消息
83. return fals e;
84. }
85. }
86.
87.
88. /**
89. *获得加密后的16进制形式口令
90. *@param password
91. *@return
92. *@throws No S uc hAlgorithmExc ep tion
93. *@throws UnsupportedEnc odingExc eption
94. */
95. public static String getEncryptedPwd(String password)
96. throws NoSuchAlgorithmException,UnsupportedEnc odingExc eption{
97. //声明加密后的口令数组变量
98. b yte[]p wd=nul l;
99. //随机数生成器
100. S ecureRandom random=new S ecureRandom();
101. //声明盐数组变量
102. b yte[] s alt=new b yte[S ALT_LENG T H];
103. //将随机数放入盐变量中
104. rand o m.nextByt e s(s alt);
105.
106. //声明消息摘要对象
107. Mes sageDigest md=null;
108. //创建消息摘要
109. md=Mes s ageDig es t.getIns tanc e("MD5");
110. //将盐数据传入消息摘要对象
111. md.up d ate(s alt);
112. //将口令的数据传给消息摘要对象
113. md.update(p ass word.getByt es("UTF-8"));
114. //获得消息摘要的字节数组
115. byte[]digest=md.digest();
116.
117. //因为要在口令的字节数组中存放盐所以加上盐的字节长度
118. p wd=new b yte[diges t.length+S ALT_LENG TH];
119. //将盐的字节拷贝到生成的加密口令字节数组的前12个字节 以便在验证口令时取出盐
120. S ys tem.arrayc o p y(s alt,0,p wd,0,S ALT_LENG T H);
121. //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
122. S ys tem.arrayc op y(diges t, 0, p wd, S ALT_LENGTH,diges t.length);
123. //将字节数组格式加密后的口令转化为16进制字符串格式的口令
124. return byteToHexS tring(pwd);
125. }
126.}p ackage com.zyg.s ecurity.md 5;imp ort java.io.Unsupp ortedEnco dingExc eption;import java.security.Mes sageDigest;import java.s ecurity.No SuchAlgorithmExc eption;import java.security.S ecureRandom;
import java.util.Arrays;public class MyMD5Util {private static final StringHEX_NUMS_S TR="0123456789ABC DEF";private static final Integer SALT_LENGTH=12;
/**
*将16进制字符串转换成字节数组
*@p aram hex
*@return
*/public static byte[]hexStringToByte(String hex) {int len=(hex.le ngth() /2);byte[]result=new byte[len];c har[]hexChars=hex.toCharArray();for(int i=0; i<len; i++) {int pos=i*2;result[i]=(byte) (HEX_NUMS_STR.indexO f(he xChars[p o s])<<4
|HEX_NUMS_STR.indexO f(hexChars[p o s +
1]));
}return result;
}
/**
*将指定byte数组转换成16进制字符串
*@param b
*@return
*/public static String byteToHexString(byte[]b) {S tringBuffer hexS tring=new S tringBuffer();for(int i=0; i<b.length; i++) {
S tring h ex=Intege r.to HexS tring(b[i]&0xF F);if(hex.le ngth()==1) {hex='0'+hex;
}hexS tr ing.ap p end(hex.to Up p erC as e());
}return hexS tring.to S tring();
}
tmhhost为2021年暑假开启了全场大促销,全部都是高端线路的VPS,速度快有保障。美国洛杉矶CN2 GIA+200G高防、洛杉矶三网CN2 GIA、洛杉矶CERA机房CN2 GIA,日本软银(100M带宽)、香港BGP直连200M带宽、香港三网CN2 GIA、韩国双向CN2。本次活动结束于8月31日。官方网站:https://www.tmhhost.com8折优惠码:TMH-SUMMER日本...
数脉科技怎么样?昨天看到数脉科技发布了7月优惠,如果你想购买香港服务器,可以看看他家的产品,性价比还是非常高的。数脉科技对香港自营机房的香港服务器进行超低价促销,可选择10M、30M的优质bgp网络。目前商家有优质BGP、CN2、阿里云线路,国内用户用来做站非常不错,目前E3/16GB阿里云CN2线路的套餐有一个立减400元的优惠,有需要的朋友可以看看。点击进入:数脉科技商家官方网站香港特价阿里云...
PacificRack最近促销上瘾了,活动频繁,接二连三的追加便宜VPS秒杀,PacificRack在 7月中下旬已经推出了五款秒杀VPS套餐,现在商家又新增了三款更便宜的特价套餐,年付低至7.2美元,这已经是本月第三波促销,带宽都是1Gbps。PacificRack 7月秒杀VPS整个系列都是PR-M,也就是魔方的后台管理。2G内存起步的支持Windows 7、10、Server 2003\20...