用java写一个请求签名校验逻辑,需要把参数也考虑进去,参数有 url的params,body的json,参数要按照特定顺序排序。
时间: 2023-12-10 13:04:08 浏览: 85
以下是一个Java请求签名校验逻辑的示例代码,它考虑了url的params和body的json,参数按照特定顺序排序:
```java
import java.util.*;
public class RequestSignValidator {
private static final String SECRET_KEY = "your_secret_key";
private static final String SIGNATURE_PARAM_NAME = "signature";
public static boolean isValidRequest(Map<String, String> params, String bodyJson, String signature) {
// 按照参数名升序排序
TreeMap<String, String> sortedParams = new TreeMap<>(params);
// 将bodyJson作为参数放入Map中
sortedParams.put("body", bodyJson);
// 拼接参数键值对为字符串
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
sb.append(SECRET_KEY);
// 计算签名并与传入的签名比较
String calculatedSignature = DigestUtils.md5Hex(sb.toString()).toUpperCase();
return calculatedSignature.equals(signature);
}
}
```
其中,`SECRET_KEY`是你的密钥,`SIGNATURE_PARAM_NAME`是签名参数的名称。`isValidRequest`方法接收三个参数:`params`是url的params,以Map形式传入;`bodyJson`是body的json字符串;`signature`是传入的签名值。方法内部先将参数按照参数名升序排序,并将`bodyJson`作为参数放入Map中,然后拼接成字符串。最后使用MD5算法计算字符串的摘要,并将结果转换成大写字符串,与传入的签名值比较,如果相等则返回true,否则返回false。
阅读全文