1、参考网上资料和书本资料,实现了API接口签名生成算法和签名验证算法。
(1)参考资料:https://www.jianshu.com/p/d47da77b6419
(2)参考书籍:高级软件架构师教程(311-312)
2、API接口签名生成算法
主要步骤如下:
(1)将所有业务请求参数按字母先后顺序排序。
(2)参数名称和参数值链接成一个字符串A。
(3)在字符串A的首尾加上apiSecret接口密匙组成一个新字符串B。
(4)对字符串进行MD5散列运算得到API签名sign,然后再进行Base64编码。
假设请求的参数为:f=1,b=23,k=33,排序后为b=23,f=1,k=33,参数名和参数值链接后为b23f1k33,首尾加上appsecret后md5:
C = md5(secretkey1value1key2value2...secret);
Base64.encode(C );
以上签名方法安全有效地解决了参数被篡改和身份验证的问题,如果参数被篡改,没事,因为别人无法知道apiSecret,也就无法重新生成新的sign,从而保证接口调用是可靠的。
Java代码
/**
* 添加参数到HTTP请求里面
* @param method
* @param path
* @param params
* @param apiKey
* @param apiSecret
*/
void addRequiredParams(String method, String path, Map<String, String> params, String apiKey, String apiSecret) {
params.put("key", apiKey); //标识
params.put("sigVer", "1"); //签名版本
String ts = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS").format(LocalDateTime.now());
params.put("ts", ts); //时间戳
params.put("nonce", RandomStringUtils.randomAlphanumeric(16));
String sig = getSig(method, path, apiSecret, params);
params.put("sig", sig); //API签名
}
/**
* API签名生成
*
* @param method
* @param path
* @param apiSecret
* @param