核心原理
通过秘钥(不公开)对数据(请求数据)进行加密(加密算法公开),加密过程不可逆,所以只有拥有秘钥的双方才能对数据进行正确的加密,从而确保请求是由可信来源发出的,并且请求在传输过程中没有被篡改。
注:
- 接口签名其实还能用作防止请求参数不被篡改
- 一般appId和appSecret成对出现,因为可能秘钥有多个,此时就需要根据appId从数据库中查询appSecret
签名算法
- 生成签名的方法通常将请求参数按照特定规则计算出一个签名值;
- 验证签名的方法则是对接收到的请求参数进行同样的处理,并计算出一个签名值,然后与请求中携带的签名值进行比对;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class Signature {
/**
* 获取签名
* @param secretKey 密钥
* @param data 需要签名的数据
* @return 签名
*/
public static String signWithHmacSha1(String secretKey, String data) {
try {
SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
return Base64.getEncoder().encodeToString(mac.doFinal(data.getBytes("UTF-8")));
} catch (NoSuchAlgorithmException | InvalidKeyException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 验证签名
* @param secretKey 密钥
* @param data 需要签名的数据
* @param hmac 已经签名的数据
* @return true:签名一致
*/
public static boolean verify(String secretKey, String data, String hmac) {
String calculatedHmac = signWithHmacSha1(secretKey, data);
return calculatedHmac.equals(hmac);
}
}
请求拦截器
参考链接
【1】https://blog.csdn.net/u011974797/article/details/138123261
标签:return,String,接口,secretKey,签名,import,data,SpringBoot From: https://www.cnblogs.com/ReturnOfTheKing/p/18626495