java api接口签名验证失败_简单API接口签名验证

本文介绍了如何在Java中实现API接口的签名验证,确保请求的来源合法性、参数不被篡改以及请求的唯一性。签名生成过程包括:使用app_key和app_secret验证身份、按参数字母顺序排序拼接并MD5加密。校验步骤涉及参数格式、超时和签名的检查。代码示例展示了签名生成和校验的详细实现。
摘要由CSDN通过智能技术生成

前言

后端在写对外的API接口时,一般会对参数进行签名来保证接口的安全性,在设计签名算法的时候,主要考虑的是这几个问题:

1. 请求的来源是否合法

2. 请求参数是否被篡改

3. 请求的唯一性

我们的签名加密也是主要针对这几个问题来实现

设计

基于上述的几个问题,我们来通过已下步骤来实现签名加密:

1. 通过分配给APP对应的app_key和app_secret来验证身份

2. 通过将请求的所有参数按照字母先后顺序排序后拼接再MD5加密老保证请求参数不被篡改

3. 请求里携带时间戳参数老保证请求的唯一和过期,重复的请求在指定时间(可配置)内有效

实现

签名生成:

生成当前时间戳timestamp=now

按照请求参数名的字母升序排列非空请求参数(包含accessKey) stringA="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random";

拼接密钥accessSecret stringSignTemp="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random&accessSecret=secret";

MD5并转换为大写生成签名 sign=MD5(stringSignTemp).toUpperCase();

JAVA代码如下:params是从request里面获取的所有参数map,accessSecret是加密密钥

private String createSign(Map params, String accessSecret) throws UnsupportedEncodingException {

Set keysSet = params.keySet();

Object[] keys = keysSet.toArray();

Arrays.sort(keys);

StringBuilder temp = new StringBuilder();

boolean first = true;

for (Object key : keys) {

if (first) {

first = false;

} else {

temp.append("&");

}

temp.append(key).append("=");

Object value = params.get(key);

String valueString = "";

if (null != value) {

valueString = String.valueOf(value);

}

temp.append(valueString);

}

temp.append("&").append(ACCESS_SECRET).append("=").append(accessSecret);

return MD5Util.MD52(temp.toString()).toUpperCase

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值