做了个springboot接口参数解密的工具,我给它命名为万能钥匙(已上传maven中央仓库,附详细使用说明)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 更新的功能具体使用示例已经更新到博文中,请在目录中找到对应位置查看

版本更新记录

更新的功能具体使用示例已经更新到博文中,请在目录中找到对应位置查看


最新版本:1.4

优化自定义解密过程功能,使其只覆盖默认解密方式,注解中指定其他解密方式不受影响;


1.3版本


新增map类型参数解密;


新增不同接口不同解密方式配置;


1.2版本


新增全局解密配置和忽略解密注解;


新增自定义解密过程接口;

介绍

用来实现接口参数解密的工具,只需引入依赖,在配置文件写明加密的配置,在接口上使用指定注解即可实现该接口的参数解密。并支持使用validation模块的注解进行参数校验,支持分组校验功能


支持的对称加密方式:SM4,AES,DES,DESede 支持的非对称加密方式:RSA,SM2


软件架构

使用java8,springboot2.x.x,一个简单的springboot starter 启动器,功能中用到的工具类是hutool


配置教程

1.引入依赖

<dependency>
            <groupId>io.github.vhukze</groupId>
            <artifactId>master-key-spring-boot-starter</artifactId>
            <version>目前最新版本</version>
        </dependency>

2.配置

注册参数解析器


import com.vhukze.masterkey.master.DecodeResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import java.util.List;
/**
 * webmvc配置
 */
@Configuration
public class MasterKeyConfig implements WebMvcConfigurer {
    @Resource
    private DecodeResolver decodeResolver;
    /**
     * 注册自定义HandlerMethodArgumentResolver  接口参数解密
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(decodeResolver);
    }
}

对称加密配置示例(配置到application.yml中)

master-key:
  # 加密方式
  encode: SM4
  # 使用json格式参数时,解密之前json的key 不配置此参数则代表使用text格式参数,只传递加密后的字符串
  json-key: str
  # 加密模式
  mode: CBC
  # 填充方式
  padding: ISO10126Padding
  # 秘钥
  key: 1234123412ABCDEF
  # 盐值
  salt: ABCDEF1234123412
  # 是否开启全局解密 默认false
  global-decode: false

对称加密配置示例(配置到application.yml中)

加密方式(encode)

加密模式(mode)

填充方式(padding)

SM4

NONE

NoPadding

AES

CBC

ZeroPadding

DES

CFB

ISO10126Padding

DESede

CTR

OAEPPadding


CTS

PKCS1Padding


ECB

PKCS5Padding


OFB


SSL3Padding


PCBC



非对称加密配置示例


master-key:
  # 加密方式
  encode: SM2
  # 使用json格式参数时,解密之前json的key 不配置此参数则代表使用text格式参数,只传递加密后的字符串
  json-key:
  # 公钥
  public-key: MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEDRhJQbkA5SKceAaJmtdOBiRzCqwei4WRzAkBrZ9SkBZhZ1zC4nteRLVi754MsI/8vsiNK2lV518E8RaNw+mnLA==
  # 私钥
  private-key: MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQ
  # 是否开启全局解密 默认false
  global-decode: false

3.注意事项

使用SM4和SM2国密加密算法时,需要引入国密加密的依赖 如下


 

<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15to18</artifactId>
            <version>1.69</version>
        </dependency>

使用说明

支持自定义实体类、基础数据类型及其包装类、集合类型。加密前参数格式跟正常请求接口时相同


不同传参方式示例

例如当前接口所需参数为:{"id":1,"count":4}


加密后为:c7dc378bf0c4da001466818765813a506b1a6b37e960b7ca


1.json格式传参

在配置文件配置好json-key,并使用配置的json-key构建json字符串,比如配置的json-key为str,json字符串如下

{
    "str":"c7dc378bf0c4da001466818765813a506b1a6b37e960b7ca"
}

实际请求如下图



2.text格式传参

不配置json-key即为使用text格式传参


实际请求如下图



不同参数类型示例

使用text传参方式演示


接口使用@ParamsDecode注解,标明此接口需要参数解密,如下

@ParamsDecode
@PostMapping("decode")
public String decode(Stock stock){
    return "";
}

如果在配置中开启了全局解密,则无需使用 @ParamsDecode注解,会对所有接口进行解密。可以使用@IngoreDecode注解标明此接口无需解密,如下

@IgnoreDecode
@PostMapping("decode")
public String decode(Stock stock){
    return "";
}

1.自定义实体类

接口参数的实体类


@Data
public class Stock {
    private Integer id;
    private Integer count;
}

加密前的请求参数: {"id":1,"count":4}


实际请求



接口接收到的参数



2.基础数据类型或其包装类

接口参数为一个int类型


加密前的请求参数:5


实际请求



接口接收到的参数



3.集合类型

接口参数为List集合


加密前的请求参数:[1,2,3]


实际请求



接口接收到的参数



4.map类型

要处理map类型,还需要新增两个配置,如下


1、在注册参数解析器的MasterKeyConfig中新增下面内容


    @Resource
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
    @PostConstruct
    public void init() {
        List<HandlerMethodArgumentResolver> newResolvers = new ArrayList<>();
        newResolvers.add(decodeResolver);
        newResolvers.addAll(requestMappingHandlerAdapter.getArgumentResolvers());
        requestMappingHandlerAdapter.setArgumentResolvers(newResolvers);
    }

2、在配置文件中开启允许循环依赖:spring.main.allow-circular-references=true


接口参数为Map


加密前的请求参数:{"id":3, "count":4}


实际请求



接口接收到的参数



自定义解密过程

新建一个类实现MkDecodeInterface接口,并实现其中decode方法,使用@Component注添加到ioc容器中即可,如下所示,是一个简单的去括号功能


注意:实现了自定义解密接口,就会使用自定义解密,配置文件的配置无效(全局解密和json-key配置不受影响)


package com.vhukze.lockdemo.config;
import com.vhukze.masterkey.abs.MkDecodeInterface;
import org.springframework.stereotype.Component;
/**
 * 集成自定义解密功能
 */
@Component
public class MkDecodeInterfaceImpl implements MkDecodeInterface {
    @Override
    public String decode(String before) {
        return before.replaceAll("\\(", "").replaceAll("\\)", "");
    }
}

实际请求


接口接收到的参数


不同接口使用不同解密方法

为了解决项目中使用的不止一个加密方式,不同接口需要使用不同的解密方式


首先在配置文件中配置多个解密配置,示例如下:


一个全局解密配置和两个单独解密配置

master-key:
  # 是否开启全局解密 默认false
#  global-decode: true
  # 加密方式
  encode: DESede
  # 解密前json的key
  json-key:
  # 加密模式
  mode: CBC
  # 填充方式
  padding: ISO10126Padding
  # 秘钥
  key: 1234123412ABCDEF12ABCDEF
  # 盐值
  salt: ABCDEF12
  # 多个解密配置 这个名称是自定义的,使用时在注解中指定
  config1:
    # 加密方式
    encode: AES
    # 解密前json的key
    json-key:
    # 加密模式
    mode: CBC
    # 填充方式
    padding: ISO10126Padding
    # 秘钥
    key: 1234123412ABCDEF
    # 盐值
    salt: ABCDEF1234123412
  config2:
    # 加密方式
    encode: DES
    # 解密前json的key
    json-key:
    # 加密模式
    mode: CBC
    # 填充方式
    padding: ISO10126Padding
    # 秘钥
    key: 1234123412ABCDEF
    # 盐值
    salt: ABCDEF12


使用时在注解中指定value字段值即可,如下


@ParamsDecode("config1")
    @PostMapping("decode")
    public String decode(Stock stock) {
        return "";
    }

指定value字段值之后,此接口便会使用注解中指定的配置解密


validation模块注解校验

实现了一些常用的注解,并支持分组校验功能,目前实现的注解有以下这些

数据类型

注解

Integer、Long、Short

@NotNull、@Max、@Min、@Null

String

@NotNull、@NotBlank、@Size、@Null、@Pattern

集合类型

@NotNull、@NotBlank、@Size、@Null、@Pattern

具体使用方式跟正常使用一样,下面有个示例


@Data
public class Stock {
    @Max(3)
    @NotNull(groups = Edit.class)
    private Integer id;
    @NotBlank(groups = {Add.class, Edit.class})
    private String name;
    @Min(3)
    private Integer count;
    public interface Add {
    }
    public interface Edit {
    }
}


@ParamsDecode
@PostMapping("decode")
public String decode(@Validated(value = Add.class) Stock stock) {
    return "";
}

最后

目前就有这些功能,如果有其他需求,欢迎提出,后续增加。


相关文章
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
25天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
42 1
SpringBoot入门(7)- 配置热部署devtools工具
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
43 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
1月前
|
Java 开发者 Spring
精通SpringBoot:16个扩展接口精讲
【10月更文挑战第16天】 SpringBoot以其简化的配置和强大的扩展性,成为了Java开发者的首选框架之一。SpringBoot提供了一系列的扩展接口,使得开发者能够灵活地定制和扩展应用的行为。掌握这些扩展接口,能够帮助我们写出更加优雅和高效的代码。本文将详细介绍16个SpringBoot的扩展接口,并探讨它们在实际开发中的应用。
50 1
|
2月前
|
存储 安全 Java
|
2月前
|
Java API Apache
除了 Maven,还有哪些工具可以管理项目的依赖和版本冲突
除了Maven,常用的项目依赖管理和版本冲突解决工具有Gradle、Ivy、Ant+Ivy、SBT等。这些工具各有特点,适用于不同的开发环境和需求。
155 2
|
2月前
|
存储 算法 安全
SpringBoot 接口加密解密实现
【10月更文挑战第18天】
|
2月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
585 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
2月前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
88 0
|
3月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码