package com.xiaopeng.trafficControl.util;
|
|
import com.xiaopeng.unifiedverification.util.md5.MD5Util;
|
import com.xiaopeng.unifiedverification.util.sha256.SHA256Util;
|
import com.xiaopeng.trafficControl.enums.SignatureType;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
import java.util.Comparator;
|
import java.util.Iterator;
|
import java.util.Map;
|
import java.util.TreeMap;
|
|
public class SignatureUtils {
|
private static final Logger LOGGER = LoggerFactory.getLogger(SignatureUtils.class);
|
|
/**
|
* 通用签名方法,签名算法为SHA1<br/>
|
* 签名原文拼装规则:<br/>
|
* ①paraMap按key的自然排序,并按key1+value1+key2+value2的规则拼接,中间无分隔符<br/>
|
* ②在第①步骤组装的String前面追加appid的值<br/>
|
* ③在第①步骤组装的String后面追加appSecret的值<br/>
|
*
|
* @param appId 业务系统唯一标识
|
* @param paraMap 所需要传递的参数map
|
* @param appSecret 分配给业务系统的秘钥
|
* @return
|
*/
|
public static String getSignatureSHA1(String appId, Map<String, String> paraMap, String appSecret) {
|
return getSignature(appId, paraMap, appSecret, SignatureType.SHA1);
|
}
|
|
/**
|
* 通用签名方法<br/>
|
* 签名原文拼装规则:<br/>
|
* ①paraMap按key的自然排序,并按key1+value1+key2+value2的规则拼接,中间无分隔符<br/>
|
* ②在第①步骤组装的String前面追加appid的值<br/>
|
* ③在第①步骤组装的String后面追加appSecret的值<br/>
|
*
|
* @param appId 业务系统唯一标识
|
* @param paraMap 所需要传递的参数map
|
* @param appSecret 分配给业务系统的秘钥
|
* @param signatureType 签名算法类型(参考SignatureType)
|
* @return
|
*/
|
public static String getSignature(String appId, Map<String, String> paraMap, String appSecret,
|
SignatureType signatureType) {
|
String originStr = buildAllSignatureOriginStr(appId, paraMap, appSecret);
|
LOGGER.info("originStr: {}", originStr);
|
return getSignature(originStr, signatureType);
|
}
|
|
// ------------------------------------------------------------------------------------------
|
|
/**
|
* 构造计算签名的完整消息内容<br/>
|
*/
|
public static String buildAllSignatureOriginStr(String appId, Map<String, String> paraMap, String appSecret) {
|
StringBuilder sb = new StringBuilder(128);
|
String result = sb.append(appId).append(buildMiddleSignatureOriginStr(paraMap)).append(appSecret).toString(); // 用于签名的原文
|
|
return result;
|
}
|
|
/**
|
* 构造计算签名的中间消息内容<br/>
|
*/
|
public static String buildMiddleSignatureOriginStr(Map<String, String> map) {
|
if (map.isEmpty()) {
|
return "";
|
}
|
|
Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
|
public int compare(String obj1, String obj2) {
|
// 升序排序
|
return obj1.compareTo(obj2);
|
}
|
});
|
|
treeMap.putAll(map);
|
|
Iterator<Map.Entry<String, String>> iter = treeMap.entrySet().iterator();
|
StringBuilder stringBuilder = new StringBuilder(128);
|
|
while (iter.hasNext()) {
|
Map.Entry<String, String> entry = iter.next();
|
|
stringBuilder.append(entry.getKey()).append(entry.getValue());
|
}
|
|
return stringBuilder.toString();
|
}
|
|
/**
|
* 计算签名
|
*
|
* @param originStr
|
* 用于签名的原始内容
|
* @param signatureType
|
* 签名算法类型(参考SignatureType)
|
* @return 签名值
|
*/
|
public static String getSignature(String originStr, SignatureType signatureType) {
|
if (SignatureType.MD5 == signatureType) {
|
return MD5Util.getMD5LowerString(originStr);
|
} else if (SignatureType.SHA1 == signatureType) {
|
return SHA1Util.getSHA1LowerString(originStr);
|
} else if (SignatureType.SHA256 == signatureType) {
|
return SHA256Util.getSHA256LowerString(originStr);
|
} else { // 默认用SHA1
|
return SHA1Util.getSHA1LowerString(originStr);
|
}
|
}
|
}
|