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); } }