CheckAuthUtils.java 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package com.boman.wechat.utils;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import java.security.MessageDigest;
  5. import java.security.NoSuchAlgorithmException;
  6. import java.util.Arrays;
  7. /**
  8. * @author shiqian
  9. * @date 2021年08月04日 13:38
  10. **/
  11. public class CheckAuthUtils {
  12. private static final Logger LOGGER = LoggerFactory.getLogger(CheckAuthUtils.class);
  13. /** 定义Token 务必与服务器保持一**/
  14. public static String AUTHORIZATION = "Authorization";
  15. public static final String SIGNATURE = "signature";
  16. public static final String TIMESTAMP = "timestamp";
  17. public static final String NONCE = "nonce";
  18. public static final String ECHOSTR = "echostr";
  19. public static final String SHA_1 = "SHA-1";
  20. /**
  21. * 验证签名
  22. *
  23. * @param signature
  24. * @param timestamp
  25. * @param nonce
  26. * @return
  27. */
  28. public static boolean checkSignature(String signature, String timestamp, String nonce) {
  29. // 将token、timestamp、nonce三个参数进行字典排序
  30. String[] arr = new String[]{AUTHORIZATION, timestamp, nonce};
  31. Arrays.sort(arr);
  32. // 将三个参数字符串拼接成一个字符串
  33. StringBuilder content = new StringBuilder();
  34. for (String s : arr) {
  35. content.append(s);
  36. }
  37. try {
  38. //获取加密工具
  39. MessageDigest md = MessageDigest.getInstance(SHA_1);
  40. // 对拼接好的字符串进行sha1加密
  41. byte[] digest = md.digest(content.toString().getBytes());
  42. String tmpStr = byteToStr(digest);
  43. //获得加密后的字符串与signature对比
  44. boolean result = tmpStr.equals(signature.toUpperCase());
  45. LOGGER.info("method: checkSignature, tmpStr: {}, result: {}", tmpStr, result);
  46. return result;
  47. } catch (NoSuchAlgorithmException e) {
  48. e.printStackTrace();
  49. }
  50. return false;
  51. }
  52. private static String byteToStr(byte[] byteArray) {
  53. StringBuilder strDigest = new StringBuilder();
  54. for (byte b : byteArray) {
  55. strDigest.append(byteToHexStr(b));
  56. }
  57. return strDigest.toString();
  58. }
  59. private static String byteToHexStr(byte mByte) {
  60. char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
  61. char[] tempArr = new char[2];
  62. tempArr[0] = digit[(mByte >>> 4) & 0X0F];
  63. tempArr[1] = digit[mByte & 0X0F];
  64. return new String(tempArr);
  65. }
  66. }