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();
}
VoLLcloud LLC是一家成立于2020年12月互联网服务提供商企业,于2021年1月份投入云计算应用服务,为广大用户群体提供云服务平台,已经多个数据中心部署云计算中心,其中包括亚洲、美国、欧洲等地区,拥有自己的研发和技术服务团队。现七夕将至,VoLLcloud LLC 推出亚洲地区(香港)所有产品7折优惠,该产品为CMI线路,去程三网163,回程三网CMI线路,默认赠送 2G DDoS/C...
DogYun(中文名称狗云)新上了一批韩国自动化上架独立服务器,使用月减200元优惠码后仅需每月300元,双E5 CPU,SSD+NVMe高性能硬盘,支持安装Linux或者Windows操作系统,下单自动化上架。这是一家成立于2019年的国人主机商,提供VPS和独立服务器租用等产品,数据中心包括中国香港、美国洛杉矶、日本、韩国、德国、荷兰等。下面分享这款自动化上架韩国独立服务器的配置和优惠码信息。...
鲨鱼机房(Sharktech)我们也叫它SK机房,是一家成立于2003年的老牌国外主机商,提供的产品包括独立服务器租用、VPS主机等,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹等,主打高防产品,独立服务器免费提供60Gbps/48Mpps攻击防御。机房提供1-10Gbps带宽不限流量服务器,最低丹佛/荷兰机房每月49美元起,洛杉矶机房最低59美元/月起。下面列出部分促销机型的配置信息。机房...