当前位置:   article > 正文

JAVA中MD5的转换_java md5加密并将结果用十进制表示

java md5加密并将结果用十进制表示
  1. import java.io.UnsupportedEncodingException;
  2. import java.security.MessageDigest;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.security.SecureRandom;
  5. import java.util.Arrays;
  6. import java.util.Scanner;
  7. public class MD5{
  8. private static final String HEX_NUMS_STR="0123456789ABCDEF";
  9. private static final Integer SALT_LENGTH = 12;
  10. /**
  11. * 将16进制字符串转换成字节数组
  12. * @param hex
  13. * @return
  14. */
  15. public static byte[] hexStringToByte(String hex) {
  16. int len = (hex.length() / 2);
  17. byte[] result = new byte[len];
  18. char[] hexChars = hex.toCharArray();
  19. for (int i = 0; i < len; i++) {
  20. int pos = i * 2;
  21. result[i] = (byte)(HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR.indexOf(hexChars[pos + 1]));
  22. }
  23. return result;
  24. }
  25. /**
  26. * 将指定byte数组转换成16进制字符串
  27. * @param b
  28. * @return
  29. */
  30. public static String byteToHexString(byte[] b) {
  31. StringBuffer hexString = new StringBuffer();
  32. for (int i = 0; i < b.length; i++) {
  33. //0XFF表示十进制的255,其中0X是java中用来申明16进制字符使用的,此时表示取当前字节的反码
  34. String hex = Integer.toHexString(b[i] & 0xFF);
  35. if (hex.length() == 1) {
  36. hex = '0' + hex;
  37. }
  38. hexString.append(hex.toUpperCase());
  39. }
  40. return hexString.toString();
  41. }
  42. /**
  43. * 获得加密后的16进制形式字符串
  44. * @param password
  45. * @return
  46. * @throws NoSuchAlgorithmException
  47. * @throws UnsupportedEncodingException
  48. */
  49. public static String getEncryptedPwd(String sourceString)
  50. throws NoSuchAlgorithmException, UnsupportedEncodingException {
  51. //声明加密后的口令数组变量
  52. byte[] pwd = null;
  53. //随机数生成器
  54. SecureRandom random = new SecureRandom();
  55. //声明盐数组变量
  56. byte[] salt = new byte[SALT_LENGTH];
  57. //将随机数放入盐变量中
  58. random.nextBytes(salt);
  59. //声明消息摘要对象
  60. MessageDigest md = null;
  61. //创建消息摘要
  62. md = MessageDigest.getInstance("MD5");
  63. //将盐数据传入消息摘要对象
  64. md.update(salt);
  65. //将口令的数据传给消息摘要对象
  66. md.update(sourceString.getBytes("UTF-8"));
  67. //获得消息摘要的字节数组
  68. byte[] digest = md.digest();
  69. //因为要在口令的字节数组中存放盐,所以加上盐的字节长度
  70. pwd = new byte[digest.length + SALT_LENGTH];
  71. //将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐
  72. System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);
  73. //将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
  74. System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);
  75. //将字节数组格式加密后的口令转化为16进制字符串格式的口令
  76. return byteToHexString(pwd);
  77. }
  78. /**
  79. * 验证口令是否合法
  80. * @param password
  81. * @param passwordInDb
  82. * @return
  83. * @throws NoSuchAlgorithmException
  84. * @throws UnsupportedEncodingException
  85. */
  86. public static boolean validPassword(String sourceString, String md5String)
  87. throws NoSuchAlgorithmException, UnsupportedEncodingException {
  88. //将16进制字符串格式口令转换成字节数组
  89. byte[] pwdInDb = hexStringToByte(md5String);
  90. //声明盐变量
  91. byte[] salt = new byte[SALT_LENGTH];
  92. //将盐从数据库中保存的口令字节数组中提取出来
  93. System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);
  94. //创建消息摘要对象
  95. MessageDigest md = MessageDigest.getInstance("MD5");
  96. //将盐数据传入消息摘要对象
  97. md.update(salt);
  98. //将口令的数据传给消息摘要对象
  99. md.update(sourceString.getBytes("UTF-8"));
  100. //生成输入口令的消息摘要
  101. byte[] digest = md.digest();
  102. //声明一个保存数据库中口令消息摘要的变量
  103. byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];
  104. //取得数据库中口令的消息摘要
  105. System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);
  106. //比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同
  107. if (Arrays.equals(digest, digestInDb)) {
  108. //口令正确返回口令匹配消息
  109. return true;
  110. } else {
  111. //口令不正确返回口令不匹配消息
  112. return false;
  113. }
  114. }
  115. public static void main(String[] args){
  116. System.out.println("-----------------MD5加密 start--------------------");
  117. try {
  118. System.out.print("-----------------请输入您要加密的内容按enter键后执行:");
  119. Scanner scanner = new Scanner(System.in);
  120. String sourceString = scanner.nextLine();
  121. String md5String = getEncryptedPwd(sourceString);
  122. System.out.println("----------加密前:"+sourceString);
  123. System.out.println("----------加密后:"+md5String);
  124. boolean falg = validPassword(sourceString,md5String);
  125. System.out.println("----------输入字符串校验结果:"+falg);
  126. } catch (NoSuchAlgorithmException e) {
  127. // TODO Auto-generated catch block
  128. e.printStackTrace();
  129. } catch (UnsupportedEncodingException e) {
  130. // TODO Auto-generated catch block
  131. e.printStackTrace();
  132. }
  133. System.out.println("-----------------MD5加密 end--------------------");
  134. }
  135. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/515616?site
推荐阅读
相关标签
  

闽ICP备14008679号