做了个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 "";
}

最后

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


相关文章
|
1天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
9 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
24天前
|
Java 关系型数据库 MySQL
Maven——创建 Spring Boot项目
Maven 是一个项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,简化了项目的构建和管理过程。其核心功能包括项目构建和依赖管理,支持创建、编译、测试、打包和发布项目。Maven 仓库分为本地仓库和远程仓库,远程仓库包括中央仓库、私服和其他公共库。此外,文档还介绍了如何创建第一个 SpringBoot 项目并实现简单的 HTTP 请求响应。
106 1
Maven——创建 Spring Boot项目
|
27天前
|
Java 关系型数据库 MySQL
如何使用 maven 创建一个 Spring Boot项目
Maven 是一个强大的项目管理工具,通过配置 `pom.xml` 文件自动获取所需的 jar 包,提高开发效率。其核心功能包括项目构建和依赖管理。项目构建支持编译、测试、打包和发布等流程,而依赖管理则通过中央仓库、本地仓库和私有服务器获取和管理项目依赖。示例中展示了如何创建第一个 SpringBoot 项目并实现简单接口。
21 1
如何使用 maven 创建一个 Spring Boot项目
|
15天前
|
Java API Apache
除了 Maven,还有哪些工具可以管理项目的依赖和版本冲突
除了Maven,常用的项目依赖管理和版本冲突解决工具有Gradle、Ivy、Ant+Ivy、SBT等。这些工具各有特点,适用于不同的开发环境和需求。
|
27天前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
301 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
29天前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
2月前
|
缓存 前端开发 Java
springboot 的单体服务 字典参数转译
本文介绍了如何在Spring Boot项目中使用缓存来管理字典参数,并确保前后端数据一致性。首先,通过`@EnableCaching`启用缓存功能,接着创建一个自定义的字典缓存类`DicCache`。然后,通过配置类将`DicCache`添加到`cacheManager`中。此外,对字典服务进行改造,使用`@CachePut`和`@CacheEvict`注解保证数据一致性。最后,实现自定义注解`@DicSerializer`和序列化处理类`DictSerializerHandel`,用于在序列化过程中自动转换字典值。通过这种方式,可最小化代码改动并提高系统性能。
springboot 的单体服务 字典参数转译
|
1月前
|
XML 安全 Java
【Maven】依赖管理,Maven仓库,Maven核心功能
【Maven】依赖管理,Maven仓库,Maven核心功能
447 3
|
2月前
|
Java 应用服务中间件 Spring
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
IDEA 工具 启动 spring boot 的 main 方法报错。已解决
|
2月前
|
JSON Java 数据格式
springboot 参数统一处理
springboot 参数统一处理

推荐镜像

更多
下一篇
无影云桌面