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

}

virmach:3.23美元用6个月,10G硬盘/VirMach1核6个月Virmach

virmach这是第二波出这种一次性周期的VPS了,只需要缴费1一次即可,用完即抛,也不允许你在后面续费。本次促销的是美国西海岸的圣何塞和美国东海岸的水牛城,周期为6个月,过后VPS会被自动且是强制性取消。需要临时玩玩的,又不想多花钱的用户,可以考虑下!官方网站:https://www.virmach.comTemporary Length Service Specials圣何塞VPS-一次性6个...

Raksmart:香港高防服务器/20Mbps带宽(cn2+bgp)/40G-100Gbps防御

RAKsmart怎么样?RAKsmart香港机房新增了付费的DDoS高防保护服务,香港服务器默认接入20Mbps的大陆优化带宽(电信走CN2、联通和移动走BGP)。高防服务器需要在下单页面的IP Addresses Option里面选择购买,分:40Gbps大陆优化高防IP-$461/月、100Gbps国际BGP高防IP-$692/月,有兴趣的可以根据自己的需求来选择!点击进入:RAKsmart官...

GigsGigsCloud(年付26美元)国际线路美国VPS主机

已经有一段时间没有听到Gigsgigscloud服务商的信息,这不今天看到商家有新增一款国际版线路的美国VPS主机,年付也是比较便宜的只需要26美元。线路上是接入Cogentco、NTT、AN2YIX以及其他亚洲Peering。这款方案的VPS主机默认的配置是1Gbps带宽,比较神奇的需要等待手工人工开通激活,不是立即开通的。我们看看这款服务器在哪里选择看到套餐。内存CPUSSD流量价格购买地址1...

md5解密为你推荐
内存卡数据恢复软件内存卡数据恢复用哪种软件最好?莫代尔和纯棉哪个好纯棉含莫代尔和100%莫代尔哪个好江门旅游景点哪个好玩的地方江门有哪些旅游景点,江门哪里好玩小说软件哪个好用免费有什么好用的免费小说软件机械表和石英表哪个好买石英表还是机械表好啊手机杀毒软件哪个好手机杀毒软件那个好用dnf魔枪士转职哪个好dnf魔枪士转职哪个适合平民玩红茶和绿茶哪个好红茶和绿茶哪个好?电动牙刷哪个好电动牙刷和普通牙刷哪个好,有何区别?美国国际集团全球500强有哪些企业是美国的
cn域名注册 万网域名证书查询 七牛优惠码 美国主机推荐 edis 正版win8.1升级win10 天猫双十一秒杀 服务器cpu性能排行 申请个人网页 权嘉云 股票老左 adroit 789电视剧 申请网站 独享主机 游戏服务器出租 lamp什么意思 群英网络 fatcow cloudflare 更多