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();
}
湖南百纵科技有限公司是一家具有ISP ICP 电信增值许可证的正规公司,多年不断转型探索现已颇具规模,公司成立于2009年 通过多年经营积累目前已独具一格,公司主要经营有国内高防服务器,香港服务器,美国服务器,站群服务器,东南亚服务器租用,国内香港美国云服务器,以及全球专线业务!活动方案:主营:1、美国CN2云服务器,美国VPS,美国高防云主机,美国独立服务器,美国站群服务器,美国母机。2、香港C...
这次RackNerd商家提供的美国大硬盘独立服务器,数据中心位于洛杉矶multacom,可选Windows、Linux镜像系统,默认内存是64GB,也可升级至128GB内存,而且硬盘采用的是256G SSD系统盘+10个16TSAS数据盘,端口提供的是1Gbps带宽,每月提供200TB,且包含5个IPv4,如果有需要更多IP,也可以升级增加。CPU核心内存硬盘流量带宽价格选择2XE5-2640V2...
古德云(goodkvm)怎么样?古德云是一家成立于2020年的商家,原名(锤子云),古德云主要出售VPS服务器、独立服务器。古德云主打产品是香港cn2弹性云及美西cn2云服务器,采用的是kvm虚拟化构架,硬盘Raid10。目前,古德云香港沙田cn2机房及美国五星级机房云服务器,2核2G,40G系统盘+50G数据盘,仅35元/月起,性价比较高,可以入手!点击进入:古德云goodkvm官方网站地址古德...