SpringBoot实现接口加解密功能

介绍

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=
此时接口正常响应

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值