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();
}
云雀云(larkyun)当前主要运作国内线路的机器,最大提供1Gbps服务器,有云服务器(VDS)、也有独立服务器,对接国内、国外的效果都是相当靠谱的。此外,还有台湾hinet线路的动态云服务器和静态云服务器。当前,larkyun对广州移动二期正在搞优惠促销!官方网站:https://larkyun.top付款方式:支付宝、微信、USDT广移二期开售8折折扣码:56NZVE0YZN (试用于常州联...
我们在去年12月分享过Hosteons新上AMD Ryzen9 3900X CPU及DDR4内存、NVMe硬盘的高性能VPS产品的消息,目前商家再次发布了产品更新信息,暂停新开100M带宽KVM套餐,新订单转而升级为新的Budget KVM VPS(SSD)系列,带宽为1Gbps端口,且配置大幅升级,目前100M带宽仅保留OpenVZ架构产品可新订购,所有原有主机不变,用户一直续费一直可用。Bud...
星梦云怎么样?星梦云好不好,资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器 。官方网站:点击访问星梦云官网活动方案:1、成都电信年中活动机(封锁UDP,不可解封):机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路4vCPU4G40G+50...