介绍
1. 接口请求加解密,实现请求参数解密、响应结果加密
2. 服务之间内部调用,配置spring.encrypt.internal-header,不需要加解密
3. 默认支持AES、DES、RSA、SM2、SM4算法
4. 支持自定义算法,需要实现Decoder、Encipher(并注入到Spring的IOC容器),并配置自定义解密器(spring.encrypt.decoder)和加密器(spring.encrypt.encipher)
5. 支持提供第三方调用接口时进行独立的加解密配置,需实现EncryptConfigService接口,根据app-id-header-name配置获取请求头appId,根据appId查询加解密配置
6. 支持过滤器方式与注解方式切换,spring.encrypt.model=filter即为过滤器方式,此时根据spring.encrypt.ignore-request-decrypt-paths和spring.encrypt.ignore-response-encrypt-paths控制哪些接口不需要加解密;spring.encrypt.model=annotation即为注解方式,此时只需要在接口上添加@Encrypt注解即可实现接口加解密
7.源码地址:encrypt-spring-boot-starter: 接口请求加解密,实现请求参数解密、响应结果加密
使用说明
依赖引入
下载源码,打包后上传到maven库或放到本地项目,然后在pom中引入依赖即可
启动类添加@EnableEncrypt注解
@SpringBootApplication
@EnableEncrypt
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
application.yml配置示例
spring:
# 接口加解密配置
encrypt:
# 是否启用
enable: true
# 模式:filter(过滤器,通过ignoreRequestDecryptPaths、ignoreResponseEncryptPaths配置不需要加解密的接口);annotation(注解,通过@Encrypt标记需要加解密的接口)
model: annotation
# 内部调用请求头,示例:inner=yes,当请求头包含inner,并且其值为yes时,不做加解密处理
internal-header: inner=yes
# 加解密算法,支持AES、DES、RSA、SM2、SM4,支持自定义算法,需要实现Decoder、Encipher
algorithm: aes
# 自定义解密器
decoder:
# 自定义加密器
encipher:
# 公钥
public-key:
# 私钥
private-key: aEsva0zDHECg47P8SuPzmw==
# 忽略请求参数解密接口
ignore-request-decrypt-paths:
# 忽略响应结果加密接口
ignore-response-encrypt-paths:
# appId请求头名称,提供给第三方调用接口时,根据此请求头值获取接口加解密配置,需实现EncryptConfigService接口
app-id-header-name: app-id
# url密文参数名称
url-parameter-name: en
# 请求body密文参数名称
body-parameter-name: data
自定义加解密算法
spring.encrypt.algorithm配置成custom
实现Decoder类并注入Spring的IOC容器,spring.encrypt.decoder配置为自定义的类
/**
* 解密
* @param content 密文
* @param publicKey 公钥
* @param privateKey 私钥
* @return
*/
String decrypt(String content, String publicKey, String privateKey);
实现Encipher类并注入Spring的IOC容器,spring.encrypt.encipher配置为自定义的类
/**
* 加密
* @param content 明文
* @param publicKey 公钥
* @param privateKey 私钥
* @return
*/
String encrypt(String content, String publicKey, String privateKey);
第三方调用接口加解密配置
实现EncryptService类并注入Spring的IOC容器,默认实现是返回不需要加密配置
/**
* 获取加解密配置
* @param appId
* @return
*/
EncryptConfig getEncryptConfig(String appId);
appId参数来源:根据app-id-header-name配置的请求头名称,从request获取的请求头
接口返回值EncryptConfig类说明
/**
* 应用ID
*/
private String appId;
/**
* 是否启用
*/
private boolean enable = false;
/**
* 加密算法
*/
private Algorithm algorithm;
/**
* 自定义解密器
*/
private Class<? extends Decoder> decoder;
/**
* 自定义加密器
*/
private Class<? extends Encipher> encipher;
/**
* 公钥
*/
private String publicKey;
/**
* 私钥
*/
private String privateKey;
注意事项
选择SM2、SM4国密算法需要额外引入相关依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.69</version>
</dependency>
url传递密文参数,需对密文进行url编码,避免特殊字符被特殊处理,接口接收到的密文参数不对,解密失败
明文:name=张三&age=18
秘钥:aEsva0zDHECg47P8SuPzmw==
AES加密后的密文:iUsLSI20HSTBPutZTZlEEk1R/rtnKRScqn+1f0N1xAY=
情景一:密文参数不做url编码处理
发送请求时url参数:en=iUsLSI20HSTBPutZTZlEEk1R/rtnKRScqn+1f0N1xAY=
接口接收到url参数:en=iUsLSI20HSTBPutZTZlEEk1R/rtnKRScqn 1f0N1xAY=
此时AES解密异常
情景二:密文参数进行url编码处理
发送请求时url参数:en=iUsLSI20HSTBPutZTZlEEk1R%2FrtnKRScqn%2B1f0N1xAY%3D
接口接收到url参数:en=iUsLSI20HSTBPutZTZlEEk1R/rtnKRScqn+1f0N1xAY=
此时接口正常响应