签名校验工具

# 签名检验工具 ### [SignatureUtil.java] ```java import org.apache.commons.codec.digest.DigestUtils; import java.util.*; public class SignatureUtil { public enum SignType { MD5, SHA1, SHA256, HMACSHA1, HMACSHA256 } public static final String FIELD_SIGN = "sign"; /** * 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。 * * @param data Map类型数据 * @param key API密钥 * @return 签名是否正确 * @throws Exception */ public static boolean isSignatureValid(final Map<String, String> data, String key) throws Exception { return isSignatureValid(data, key, SignType.MD5); } /** * 判断签名是否正确,必须包含sign字段,否则返回false。 * * @param data Map类型数据 * @param key API密钥 * @param signType 签名方式 * @return 签名是否正确 * @throws Exception */ public static boolean isSignatureValid(final Map<String, String> data, String key, SignType signType) throws Exception { if (!data.containsKey(FIELD_SIGN)) { return false; } String sign = data.get(FIELD_SIGN); return generateSignature(data, key, signType).equals(sign); } /** * 生成签名 * * @param data 待签名数据 * @param key API密钥 * @return 签名 */ public static String generateSignature(final Map<String, String> data, String key) throws Exception { return generateSignature(data, key, SignType.MD5); } /** * 生成签名 * * @param data 待签名数据 * @param key API密钥 * @param signType 签名方式 * @return 签名 */ public static String generateSignature(final Map<String, String> data, String key, SignType signType) throws Exception { Set<String> keySet = data.keySet(); String[] keyArray = keySet.toArray(new String[keySet.size()]); Arrays.sort(keyArray); StringBuilder sb = new StringBuilder(); for (String k : keyArray) { if (k.equals(FIELD_SIGN)) { continue; } if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名 sb.append(k).append("=").append(data.get(k).trim()).append("&"); } sb.append("key=").append(key); if (SignType.MD5.equals(signType)) { return MD5(sb.toString()).toUpperCase(); } else if (SignType.SHA1.equals(signType)) { return SHA1(sb.toString()).toUpperCase(); } else if (SignType.SHA256.equals(signType)) { return SHA256(sb.toString()).toUpperCase(); } else { throw new Exception(String.format("Invalid signType: %s", signType)); } } /** * 生成 MD5 * * @param data 待处理数据 * @return MD5结果 */ public static String MD5(String data) { return DigestUtils.md5Hex(data); } /** * 生成 SHA1 * * @param data 待处理数据 * @return SHA1结果 */ public static String SHA1(String data) { return DigestUtils.sha1Hex(data); } /** * 生成 SHA256 * * @param data 待处理数据 * @return SHA1结果 */ public static String SHA256(String data) { return DigestUtils.sha256Hex(data); } public static void main(String[] a) { // appId、appSecret 请联系商务获取 String appId = "test"; String appSecret = "123456789"; SignType signType = SignType.MD5; Map<String, String> data = new HashMap<>(); data.put("appId", appId); data.put("nonceStr", UUID.randomUUID().toString()); data.put("signType", signType.name()); data.put("timestamp", String.valueOf(System.currentTimeMillis())); String sign = generateSignature(data, appSecret, signType); data.put("sign", sign); System.out.println(data); } } ```