2 个回答
一般的做法是根据传递的参数进线排序,然后拼接上秘钥生成MD5签名进线比对sign即可,示例代码如下:
1、把参数进行排序生成签名
1、把参数进行排序生成签名
// 生成签名
public static String generateSignature(Map<String, String> params, String secretKey) throws NoSuchAlgorithmException {
// 按字母顺序排序参数
Map<String, String> sortedParams = new HashMap<>(params);
sortedParams.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(entry -> sortedParams.put(entry.getKey(), entry.getValue()));
// 拼接参数和密钥
StringBuilder sb = new StringBuilder();
sortedParams.forEach((key, value) -> sb.append(key).append("=").append(value).append("&"));
sb.append("key=").append(secretKey);
// 生成MD5签名
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(sb.toString().getBytes());
return bytesToHex(digest);
}
发布于:1个月前 (03-21) IP属地:四川省
2、字节数组需要转换成16进制
// 辅助方法:将字节数组转换为十六进制字符串
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
3、验证签名:// 验证签名
public static boolean verifySignature(Map<String, String> params, String receivedSignature, String secretKey) throws NoSuchAlgorithmException {
String generatedSignature = generateSignature(params, secretKey);
return generatedSignature.equals(receivedSignature);
}
发布于:1个月前 (03-21) IP属地:四川省
我来回答
您需要 登录 后回答此问题!