第一步:创建一个TreeMap来对接收到的数据进行排序,确保参数按照参数名的ASCII码从小到大排序。
第二步:在verifySignature()方法中,构建待签名的字符串stringA,并根据给定的KEY拼接了stringSignTemp。使用md5Hash()方法计算stringSignTemp的MD5摘要,并将摘要转换为大写。将计算得到的签名signValue与接口获取到的签名receivedSign进行比较,以验证签名是否匹配。
以下是代码示例,供参考。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class MD5Util {
private static final String KEY = "key"; // 替换为真实的key值
public static boolean verifySignature(Map<String, String> receivedData, String receivedSign) {
// 将接收到的数据按照参数名进行排序
TreeMap<String, String> sortedData = new TreeMap<>(receivedData);
// 构建待签名字符串
StringBuilder stringA = new StringBuilder();
for (Map.Entry<String, String> entry : sortedData.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (value != null && !value.isEmpty()) {
stringA.append(key).append("=").append(value).append("&");
}
}
// 拼接key,并进行MD5运算
String stringSignTemp = stringA.append("key=").append(KEY).toString();
String signValue = md5Hash(stringSignTemp).toUpperCase();
// 验证签名是否匹配
return signValue.equals(receivedSign);
}
private static String md5Hash(String data) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashBytes = md.digest(data.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte hashByte : hashBytes) {
String hex = Integer.toHexString(0xFF & hashByte);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
Map<String, String> receivedData = new HashMap<>();
receivedData.put("key1", "value1");
receivedData.put("key2", "value2");
String receivedSign = "receivedSign"; // 接口获取到的sign值
boolean isValidSignature = verifySignature(receivedData, receivedSign);
System.out.println("签名是否验证成功? " + isValidSignature);
}
}
注意:示例中的KEY值需要替换为真实的值。
如有纰漏,望大家斧正。