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
* 签名原文拼装规则:
* ①paraMap按key的自然排序,并按key1+value1+key2+value2的规则拼接,中间无分隔符
* ②在第①步骤组装的String前面追加appid的值
* ③在第①步骤组装的String后面追加appSecret的值
*
* @param appId 业务系统唯一标识
* @param paraMap 所需要传递的参数map
* @param appSecret 分配给业务系统的秘钥
* @return
*/
public static String getSignatureSHA1(String appId, Map paraMap, String appSecret) {
return getSignature(appId, paraMap, appSecret, SignatureType.SHA1);
}
/**
* 通用签名方法
* 签名原文拼装规则:
* ①paraMap按key的自然排序,并按key1+value1+key2+value2的规则拼接,中间无分隔符
* ②在第①步骤组装的String前面追加appid的值
* ③在第①步骤组装的String后面追加appSecret的值
*
* @param appId 业务系统唯一标识
* @param paraMap 所需要传递的参数map
* @param appSecret 分配给业务系统的秘钥
* @param signatureType 签名算法类型(参考SignatureType)
* @return
*/
public static String getSignature(String appId, Map paraMap, String appSecret,
SignatureType signatureType) {
String originStr = buildAllSignatureOriginStr(appId, paraMap, appSecret);
LOGGER.info("originStr: {}", originStr);
return getSignature(originStr, signatureType);
}
// ------------------------------------------------------------------------------------------
/**
* 构造计算签名的完整消息内容
*/
public static String buildAllSignatureOriginStr(String appId, Map paraMap, String appSecret) {
StringBuilder sb = new StringBuilder(128);
String result = sb.append(appId).append(buildMiddleSignatureOriginStr(paraMap)).append(appSecret).toString(); // 用于签名的原文
return result;
}
/**
* 构造计算签名的中间消息内容
*/
public static String buildMiddleSignatureOriginStr(Map map) {
if (map.isEmpty()) {
return "";
}
Map treeMap = new TreeMap(new Comparator() {
public int compare(String obj1, String obj2) {
// 升序排序
return obj1.compareTo(obj2);
}
});
treeMap.putAll(map);
Iterator> iter = treeMap.entrySet().iterator();
StringBuilder stringBuilder = new StringBuilder(128);
while (iter.hasNext()) {
Map.Entry 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);
}
}
}