前言
初入程序员行列,随着工作的不断展开,我对业务上的逻辑也逐渐熟悉。在开发过程中少不了看api文档,文档中常常又少不了签名,本文就介绍了我对API文档规则中签名的认识。
一、api文档中的签名是什么?
签名是一个参数sign,一般开发者会给出指定的签名算法,然后还会提供私钥,并将私钥参与签名算法,生成最后的签名。签名会当作入参传入接口,接口内部会有相对应的签名算法进行校验,可以判断身份是否正确等等,签名是用于保证开放api接口的安全问题的。
二、对文档规则中的签名算法的认识
签名算法是这个api接口文档的开发者提供的一个sign签名参数的生成方法,也就是告诉你这个sign的参数是怎么生成的,只有生成了按照指定算法生成的sign并传入所调用的指定接口,才能通过签名校验去正常访问接口。
一般的签名算法都会有这么几步,如下:
- 设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;
- 在stringA最后拼接上私钥得到字符串stringSignTemp;
- 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。
生成的签名参数长这样:4A5078DABBCE0D9C4E7668DACB96FF7A
三、生成签名的函数
提供一个生成签名的函数,可供参考,代码如下:
/*
* @Date 2021/7/22 07:37
* @Param [params, privateKey 私钥]
* @Return java.lang.String
* @Desc 签名生成方法
*
*/
public static String createSign(Map<String, String> params, String privateKey) {
StringBuilder sb = new StringBuilder();
// 将参数以参数名的字典升序排序
Map<String, String> sortParams = new TreeMap<String, String>(params);
// 遍历排序的字典,并拼接"key=value"格式
for (Map.Entry<String, String> entry : sortParams.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().trim();
if (!StringUtils.isEmpty(value))
sb.append("&").append(key).append("=").append(value);
}
String stringA = sb.toString().replaceFirst("&", "");
String stringSignTemp = stringA + "&" + "key=" + privateKey;
//将签名使用MD5加密并全部字母变为大写
// String signValue = Md5Encrypt.md5(stringSignTemp).toUpperCase();
String signValue = DigestUtils.md5Hex(stringSignTemp + getTimestamp()).toUpperCase();
System.out.println("stringA+privateKey后MD5加密+转换全部大写生成sign为:" + signValue);
return signValue;
}
总结
签名其实就是一个字符串,只是需要按照文档的规则去生成而已。本文仅仅简单介绍了我对api文档规则中有关签名的认识,希望对你有所帮助。