From 214d1d01da3a59fe6f052ff727143fc6cfbf876f Mon Sep 17 00:00:00 2001 From: dimengzhe Date: Sat, 7 Dec 2024 16:17:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E5=A4=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/SignatureUtil.java | 71 +++++++++++++++++++++++++++ src/main/java/SignatureValidator.java | 28 +++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/main/java/SignatureUtil.java create mode 100644 src/main/java/SignatureValidator.java diff --git a/src/main/java/SignatureUtil.java b/src/main/java/SignatureUtil.java new file mode 100644 index 0000000..eb7ef45 --- /dev/null +++ b/src/main/java/SignatureUtil.java @@ -0,0 +1,71 @@ +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; +import java.util.TreeMap; + +/** + * @description: 生成签名 + * @author: dimengzhe + * @date: 2024/11/28 + **/ +public class SignatureUtil { + + + /** + * 生成请求签名 + * + * @param parameters 请求参数 + * @param appKey 应用的 AppKey + * @param secret 密钥 + * @return 签名 + */ + public static String generateSignature(Map parameters, String appKey, String secret) throws UnsupportedEncodingException, NoSuchAlgorithmException { + // 1. 使用 TreeMap 按照字典顺序对参数进行排序 + Map sortedParams = new TreeMap<>(parameters); + sortedParams.put("_app", appKey); // 添加应用的 AppKey + sortedParams.put("_t", String.valueOf(System.currentTimeMillis())); // 添加时间戳 + + // 2. 拼接参数字符串 + String content = joinParameters(sortedParams); + + // 3. 将密钥加在参数字符串的前后 + content = secret + content + secret; + + // 4. 计算签名 (MD5) + return md5(content); + } + + /** + * 拼接参数字符串 + * + * @param parameters 排序后的参数 + * @return 拼接后的参数字符串 + */ + private static String joinParameters(Map parameters) throws UnsupportedEncodingException { + StringBuilder builder = new StringBuilder(); + for (Map.Entry entry : parameters.entrySet()) { + if (builder.length() > 0) { + builder.append("&"); + } + builder.append(entry.getKey()).append("=").append(entry.getValue()); + } + return builder.toString(); + } + + /** + * 计算 MD5 + * + * @param content 要计算 MD5 的字符串 + * @return MD5 值 + */ + private static String md5(String content) throws NoSuchAlgorithmException { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] bytes = md.digest(content.getBytes()); + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } +} diff --git a/src/main/java/SignatureValidator.java b/src/main/java/SignatureValidator.java new file mode 100644 index 0000000..43a2052 --- /dev/null +++ b/src/main/java/SignatureValidator.java @@ -0,0 +1,28 @@ +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +/** + * @description: 验证签名方法 + * @author: dimengzhe + * @date: 2024/11/28 + **/ +public class SignatureValidator { + + /** + * 验证签名是否正确 + * + * @param parameters 请求参数 + * @param appKey 应用的 AppKey + * @param secret 密钥 + * @param receivedSignature 请求中的签名 + * @return 是否验证通过 + */ + public static boolean validateSignature(Map parameters, String appKey, String secret, String receivedSignature) throws UnsupportedEncodingException, NoSuchAlgorithmException { + // 1. 重新生成签名 + String calculatedSignature = SignatureUtil.generateSignature(parameters, appKey, secret); + + // 2. 比较计算出来的签名和请求中的签名 + return calculatedSignature.equals(receivedSignature); + } +}