口令MD5加解密及测试方法

md5解密  时间:2021-01-31  阅读:()

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();

}

无忧云-河南洛阳BGP,CEPH集群分布式存储,数据安全可靠,活动期间月付大优惠!

 无忧云怎么样?无忧云服务器好不好?无忧云值不值得购买?无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点...

PacificRack(年付低至19美元),夏季促销PR-M系列和多IP站群VPS主机

这几天有几个网友询问到是否有Windows VPS主机便宜的VPS主机商。原本他们是在Linode、Vultr主机商挂载DD安装Windows系统的,有的商家支持自定义WIN镜像,但是这些操作起来特别效率低下,每次安装一个Windows系统需要一两个小时,所以如果能找到比较合适的自带Windows系统的服务器那最好不过。这不看到PacificRack商家有提供夏季促销活动,其中包括年付便宜套餐的P...

Digital-VM暑期全场六折优惠,8个机房

Digital-VM商家目前也在凑热闹的发布六月份的活动,他们家的机房蛮多的有提供8个数据中心,包括日本、洛杉矶、新加坡等。这次六月份的促销活动全场VPS主机六折优惠。Digital-VM商家还是有一点点特点的,有提供1Gbps和10Gbps带宽的VPS主机,如果有需要大带宽的VPS主机可以看看。第一、商家优惠码优惠码:June40全场主机六折优惠,不过仅可以月付、季付。第二、商家VPS主机套餐1...

md5解密为你推荐
手动挡和自动挡哪个好自动挡手动挡哪个好?手机音乐播放器哪个好哪种手机音乐播放器最好电陶炉和电磁炉哪个好电陶炉和电磁炉哪个好雅思和托福哪个好考托福和雅思哪个好考 急。。。。。美国国际集团世界五百强企业前五十名是哪些?辽宁联通网上营业厅辽宁联通网上营业厅为什么不能交小灵通的话费?如何增加百度收录如何快速提高百度收录量铁通dns服务器地址铁通dns服务器地址360云盘转存百度云盘如何把360云盘文件转存到百度云网盘哪个快递最便宜快递那种便宜 20公斤寄什么快递便宜
免费注册域名 虚拟主机试用30天 厦门虚拟主机 狗爹 pccw mediafire 外国服务器 免费名片模板 华为云主机 免费静态空间 ev证书 促正网秒杀 刀片服务器的优势 域名接入 isp服务商 hktv 卡巴斯基免费试用版 英雄联盟台服官网 西安主机 黑科云 更多