如何生成Sign
生成sign的逻辑说明
生成签名 sign 的时候,将颁发的 signKey 加入到传递的参数中,参与加密 传递的参数(包含 signKey)按照参数名升序排序,然后,以&形式连接(类似格式为 a=xxx&b=xxx&c=xxx...),生成小写的 md5 串 signKey 不要参与参数传递,只参与生成 sign 其中:account,secret,signKey 由渠道方提供
加密 java 示例代码
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;
public class AuthenticationUtils {
private static MessageDigest md5 = null;
public static String generateSign(TreeMap map) throws UnsupportedEncodingException {
Map<String, String> resultMap = sortMapByKey(map);
String str = new String();
for (Map.Entry<String, String> entry : resultMap.entrySet()) {
if (str.equals("")) {
str = entry.getKey() + "=" + entry.getValue();
} else {
str += "&" + entry.getKey() + "=" + entry.getValue();
}
}
String sign = getMd5(str);
return sign;
}
public static Map<String, String> sortMapByKey(Map<String, String> map) {
if (map == null || map.isEmpty()) {
return null;
}
Map<String, String> sortMap = new TreeMap<String, String>(
new MapKeyComparator());
sortMap.putAll(map);
return sortMap;
}
public static String getMd5(String str) throws UnsupportedEncodingException {
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.getMessage());
}
byte[] bs = md5.digest(str.getBytes("utf-8"));
StringBuilder sb = new StringBuilder(40);
for (byte x : bs) {
if ((x & 0xff) >> 4 == 0) {
sb.append("0").append(Integer.toHexString(x & 0xff));
} else {
sb.append(Integer.toHexString(x & 0xff));
}
}
return sb.toString();
}
}
import java.util.Comparator;
class MapKeyComparator implements Comparator<String> {
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}
加密 python示例代码
import hashlib
from collections import OrderedDict
def generate_sign(params, sign_key):
# 将参数按键名升序排序
sorted_params = OrderedDict(sorted(params.items(), key=lambda t: t[0]))
# 将 signKey 添加到参数中
sorted_params['signKey'] = sign_key
# 构建待加密的字符串
str_to_encrypt = '&'.join(f"{key}={value}" for key, value in sorted_params.items())
# 生成 MD5 签名
sign = hashlib.md5(str_to_encrypt.encode('utf-8')).hexdigest()
return sign
# 示例参数
params = {
'account': 'example_account',
'secret': 'example_secret'
}
# 假设的 signKey
sign_key = 'your_sign_key_here'
# 生成签名
sign = generate_sign(params, sign_key)