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();
}
目前在标准互联这边有两台香港云服务器产品,这不看到有通知到期提醒才关注到。平时我还是很少去登录这个服务商的,这个服务商最近一年的促销信息比较少,这个和他们的运营策略有关系。已经从开始的倾向低价和个人用户云服务器市场,开始转型到中高端个人和企业用户的独立服务器。在这篇文章中,有看到标准互联有推出襄阳电信高防服务器100GB防御。有三款促销方案我们有需要可以看看。我们看看几款方案配置。型号内存硬盘IP...
HostYun 商家以前是玩具主机商,这两年好像发展还挺迅速的,有点在要做点事情的味道。在前面也有多次介绍到HostYun商家新增的多款机房方案,价格相对还是比较便宜的。到目前为止,我们可以看到商家提供的VPS主机包括KVM和XEN架构,数据中心可选日本、韩国、香港和美国的多个地区机房,电信双程CN2 GIA线路,香港和日本机房,均为国内直连线路。近期,HostYun上线低价版美国CN2 GIA ...
欧路云(oulucloud) 商家在前面的文章中也有陆续介绍过几次,这不今天有看到商家新增加美国Cera线路的VPS主机,而且有提供全场八折优惠。按照最低套餐最低配置的折扣,月付VPS主机低至22元,还是比较便宜的。不过我们需要注意的是,欧路云是一家2021年新成立的国人主机商,据说是由深圳和香港的几名大佬创建。如果我们有介意新商家的话,选择的时候谨慎且月付即可,注意数据备份。商家目前主营高防VP...