接口加密通信思路:
1)约定双方通信的秘钥,如:appKey = wenzhou
2)通信安全校验通过签名sign
1.生成时间戳、随机数或随机字符串等,如:时间戳:time=677899002
2.将通信秘钥、时间戳、接口传递的参数通过双方约定的拼接方式拼接在一起,如:
约定方式例一:key1=value1&key2=value2&key3=&key4=value4&appKey=wenzhou&time=677899002&
约定方式例二:key1value1key2value2key3value3key4value4appKeywenzhoutime677899002
除此之外还有很多,用户自己约定即可
3.约定签名的复杂规则,如:可以替换掉拼接字符串的指定字符、字符串前后字符对调、字符左移或右移等
如给约定方式例一做字符串对调: &200998776=emit&uohznew=yeKppa&4eulav=4yek&=3yek&2eulav=2yek&1eulav=1yek
如给约定方式例二做字符串中y字符替换为*:ke*1value1ke*2value2ke*3value3ke*4value4appKe*wenzhoutime677899002
方式很多,用户自行约定即可,此步骤也可以不做
4.双方约定使用相同的加密方式,对最终字符串进行加密,生成签名sign(还可以将生成的签名全部大写一下)
MD5 、Base64 、RSA 等等加密算法或者自己编写加密算法
3)调用方将用上述方法生成的签名连同参与生成签名的接口传参的参数一起传递给接收方
4)接收方使用相同的方式生成签名,对比签名是否一致
5)接收方校验appKey是否一致
6)接收方校验时间戳time加上指定时长,如时间戳加5秒(时间戳有效时长为5秒),若当前时间已经大于时间戳加5秒后的时间,则此签名过期,拒绝访问
约定双方通信的秘钥(接口提供方,需将appKey配置下来)
这里,我配置在application.properties中。小伙伴可根据自己需要自行决定配置方式
MD5加密工具类(使用MD5加密生成签名)
这里加密拼接后的字符串生成签名,加密方式有很多种,如:RSA 、MD5、Base64
package com.gwssi.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.MessageDigest;
public class MD5Util {
final static Logger log = LoggerFactory.getLogger(MD5Util.class);
/**
* 十六进制下数字到字符的映射数组
*/
private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4",