大家好,欢迎来到IT知识分享网。
目录
一、为什么需要 API 接口签名
对外开放的 API 接口都会面临一些安全问题,例如伪装攻击、篡改攻击、重放攻击以及数据信息泄漏的风险。利用 API 接口签名能方便的防范这些安全问题和风险。在设计 API 接口签名时主要考虑以下几点:
- 保证请求数据正确
当请求中的某一个字段的值变化时,原有的签名结果就会发生变化。所以,只要参数发生变化,签名就要发生变化,否则请求将会是一个无效的请求。
- 保证请求来源合法
一般情况下,生成签名的算法都会成对出现一个 appKey 和一个 appSecret,根据 appKey 能识别出调用者身份;根据 appSecret 能识别出签名是否合法。
- 识别接口的时效性
一般情况下,签名和参数中会包含时间戳,这样服务端就可以验证客户端请求是否在有效时间内,从而避免接口被长时间的重复调用。
二、API 接口签名验签实现机制
- 签名验签流程图
1 客户端向服务端申请 appKey,appSecret ,服务端下发 appKey,appSecret。
2 客户端集成 SDK 产生 sign,将 appKey,请求参数,时间戳,sign发送到服务端,服务端根据请求参数使用 SDK 中的签名规则生成签名来验证sign的合法性,之后返回结果。
- 代码实现
//签名
public static Map<String, String> generateSign(String appKey, String appSecret, String url, String method) throws NoSuchAlgorithmException, InvalidKeyException {
Map<String, String> headers = new HashMap<String, String>();
SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT_STRING);
df.setTimeZone(new SimpleTimeZone(0, TIME_ZONE));
String timestamp = df.format(new Date());
StringBuilder stringToSign = new StringBuilder();
stringToSign.append(method.toUpperCase()).append(url).append(timestamp);
String signature = sign(appSecret, stringToSign.toString());
headers.put("signature", signature);
headers.put("appKey", appKey);
headers.put("timestamp", timestamp);
return headers;
}
//验证签名
public static String validateSign(String appSecret, String url, String method, String timestamp) throws NoSuchAlgorithmException, InvalidKeyException {
StringBuilder stringToSign = new StringBuilder();
stringToSign.append(method.toUpperCase()).append(url).append(timestamp);
return sign(appSecret, stringToSign.toString());
}
//签名和验签公用方法
private static String sign(String appSecret, String stringToSign)
throws InvalidKeyException, NoSuchAlgorithmException {
SecretKeySpec signingKey = new SecretKeySpec(appSecret.getBytes(CHARSET), "HmacSHA1");
Mac mac = Mac.getInstance(ALGORITHM_HMAC_SHA1);
mac.init(signingKey);
byte[] data = mac.doFinal(stringToSign.getBytes(CHARSET));
return Base64.getEncoder().encodeToString(data);
}
参考文档:请求签名 – 短信服务 – 阿里云
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21318.html