MD5Util.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package com.sckw.access.util;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.commons.lang3.StringUtils;
  4. import java.nio.charset.StandardCharsets;
  5. import java.security.MessageDigest;
  6. import java.security.NoSuchAlgorithmException;
  7. /**
  8. * MD5 消息摘要算法(利用哈希算法来加密的)
  9. *
  10. * @author xcq
  11. * @date 2022年07月27日 20:04
  12. */
  13. @Slf4j
  14. public class MD5Util {
  15. //十六进制下数字到字符的映射数组
  16. private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4",
  17. "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
  18. /**
  19. * md5加密算法 返回String
  20. *
  21. * @param originString
  22. * @return
  23. */
  24. public static String encodeByMD5(String originString) {
  25. if (originString != null) {
  26. try {
  27. //创建具有指定算法名称的信息摘要
  28. MessageDigest md = MessageDigest.getInstance("MD5");
  29. //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
  30. byte[] results = md.digest(originString.getBytes());
  31. //将得到的字节数组变成字符串返回
  32. StringBuilder sb = new StringBuilder();
  33. for (int j : results) {
  34. int n = j;
  35. if (n < 0) {
  36. n = 256 + n;
  37. }
  38. int d1 = n / 16;
  39. int d2 = n % 16;
  40. sb.append(HEX_DIGITS[d1]).append(HEX_DIGITS[d2]);
  41. }
  42. return sb.toString();
  43. } catch (Exception ex) {
  44. ex.printStackTrace();
  45. }
  46. }
  47. return null;
  48. }
  49. /**
  50. * 计算字符串的MD5值
  51. *
  52. * @param string 明文
  53. * @return 字符串的MD5值
  54. */
  55. public static String md5(String string) {
  56. if (string.isEmpty()) {
  57. return "";
  58. }
  59. MessageDigest md5;
  60. try {
  61. md5 = MessageDigest.getInstance("MD5");
  62. byte[] bytes = md5.digest(string.getBytes(StandardCharsets.UTF_8));
  63. StringBuilder result = new StringBuilder();
  64. for (byte b : bytes) {
  65. /* & 0xff 可以将负数转为正数*/
  66. String temp = Integer.toHexString(b & 0xff);
  67. // 16进制数 temp小于16
  68. if (temp.length() == 1) {
  69. temp = "0" + temp;
  70. }
  71. result.append(temp);
  72. }
  73. return result.toString();
  74. } catch (NoSuchAlgorithmException e) {
  75. e.printStackTrace();
  76. }
  77. return null;
  78. }
  79. /*其它方法*/
  80. /**
  81. * md5摘要
  82. *
  83. * @param s 需要转换的字符串
  84. * @return 返回字节形式的md5摘要数据
  85. */
  86. public static byte[] byteMD5(String s) {
  87. MessageDigest md;
  88. try {
  89. md = MessageDigest.getInstance("MD5");
  90. md.reset();
  91. md.update(s.getBytes(StandardCharsets.UTF_8));
  92. return md.digest();
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. }
  96. return null;
  97. }
  98. /**
  99. * 将字节数据转换为16进制的字符串数据
  100. *
  101. * @param hash 转换后的字节数组
  102. * @return 返回16进制的字符串
  103. */
  104. public static String byteToHex(byte[] hash) {
  105. if (hash == null) {
  106. return null;
  107. }
  108. StringBuffer buf = new StringBuffer(hash.length * 2);
  109. int i;
  110. for (i = 0; i < hash.length; i++) {
  111. /* & 0xff 可以将负数转为正数*/
  112. /* <0x10 表示小于16,需要进行补零*/
  113. if ((hash[i] & 0xff) < 0x10) {
  114. buf.append("0");
  115. }
  116. buf.append(Long.toString(hash[i] & 0xff, 16));
  117. }
  118. return buf.toString();
  119. }
  120. /**
  121. * 将字节数组转换为十六进制字符串
  122. *
  123. * @param data 待转换的字节数组
  124. * @return 转换后的十六进制字符串
  125. */
  126. private static String toHexString(byte[] data) {
  127. StringBuilder sb = new StringBuilder();
  128. for (byte b : data) {
  129. sb.append(String.format("%02X", b));
  130. }
  131. return sb.toString();
  132. }
  133. /**
  134. * 验证MD5校验值是否正确
  135. *
  136. * @param data 待验证的数据
  137. * @param md5ToCheck 待验证的MD5校验值
  138. * @return true表示校验通过,false表示校验失败
  139. */
  140. public static boolean verifyMD5(String data, String md5ToCheck) {
  141. String check = md5(data);
  142. log.info("我方签名:{}", check);
  143. log.info("来访者签名:{}", md5ToCheck);
  144. return StringUtils.equals(check, md5ToCheck);
  145. }
  146. }