12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package com.boman.wechat.utils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.Arrays;
- /**
- * @author shiqian
- * @date 2021年08月04日 13:38
- **/
- public class CheckAuthUtils {
- private static final Logger LOGGER = LoggerFactory.getLogger(CheckAuthUtils.class);
- /** 定义Token 务必与服务器保持一**/
- public static String AUTHORIZATION = "Authorization";
- public static final String SIGNATURE = "signature";
- public static final String TIMESTAMP = "timestamp";
- public static final String NONCE = "nonce";
- public static final String ECHOSTR = "echostr";
- public static final String SHA_1 = "SHA-1";
- /**
- * 验证签名
- *
- * @param signature
- * @param timestamp
- * @param nonce
- * @return
- */
- public static boolean checkSignature(String signature, String timestamp, String nonce) {
- // 将token、timestamp、nonce三个参数进行字典排序
- String[] arr = new String[]{AUTHORIZATION, timestamp, nonce};
- Arrays.sort(arr);
- // 将三个参数字符串拼接成一个字符串
- StringBuilder content = new StringBuilder();
- for (String s : arr) {
- content.append(s);
- }
- try {
- //获取加密工具
- MessageDigest md = MessageDigest.getInstance(SHA_1);
- // 对拼接好的字符串进行sha1加密
- byte[] digest = md.digest(content.toString().getBytes());
- String tmpStr = byteToStr(digest);
- //获得加密后的字符串与signature对比
- boolean result = tmpStr.equals(signature.toUpperCase());
- LOGGER.info("method: checkSignature, tmpStr: {}, result: {}", tmpStr, result);
- return result;
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- return false;
- }
- private static String byteToStr(byte[] byteArray) {
- StringBuilder strDigest = new StringBuilder();
- for (byte b : byteArray) {
- strDigest.append(byteToHexStr(b));
- }
- return strDigest.toString();
- }
- private static String byteToHexStr(byte mByte) {
- char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
- char[] tempArr = new char[2];
- tempArr[0] = digit[(mByte >>> 4) & 0X0F];
- tempArr[1] = digit[mByte & 0X0F];
- return new String(tempArr);
- }
- }
|