签名校验工具
# 签名检验工具
### [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);
}
}
```