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); } } }