【Java项目】基于Spring AOP + Redisson技术实现接口简单鉴

【Java项目接口签名技术实现】
概述
在为第三方系统提供接口的时候,肯定要考虑接口数据安全问题,比如数据是否被篡改,请求是否已经过时,请求是否允许重复提交等问题。
设计思路
因此接口签名主要解决如下几个问题:
1、前端请求必须在规定时间范围内才生效;
2、请求发起方必须是已经被授权的应用;
3、请求不能够被重复发起;
4、请求发起时传入的参数不能够被篡改。
接口签名规则
在header中加入4个参数:

第三方请求合法性
线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret
单次请求失效性
加入timestamp(时间戳),5分钟内数据有效
请求判重
加入流水号(随机数)nonce(防止重复提交),约定为10位。 在有效期内的唯一性,为避免重复请求,放入缓存,5分钟过期
接口参数加密
加入sign,所有数据的签名信息,sign字段生成规则如下:
将RequestBody中的参数序列化为SortedMap<String, String>,所有key=value进行拼接,按照key字典序排序为一个字符串,然后进行MD5加密,org.springframework.util.DigestUtils.md5DigestAsHex()
验签逻辑
将appid、timestamp、nonce、sign 4个字段再次按照key字典序排序,然后进行MD5加密,org.springframework.util.DigestUtils.md5DigestAsHex(),得到字符串,再通过sun.misc.BASE64Encoder.encode(signStr),得到最终验签字符串。