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

前言:之前工作中做过两个功能,就是之前写的这两篇博客,最近几天有个想法,给它做成一个springboot的start启动器,直接引入依赖,写好配置就能用了

springboot使用自定义注解实现接口参数解密,普通字段,json,集合

使用反射实现@RequestBody的参数校验功能

 现在,它来了。

项目地址:

gitee:https://gitee.com/vhukze/master-key 

github:https://github.com/vhukze/master-key

目录

版本更新记录

最新版本:1.3

介绍

软件架构

配置教程 

1.引入依赖

2.配置

3.注意事项

使用说明

不同传参方式示例

1.json格式传参

2.text格式传参

不同参数类型示例

1.自定义实体类

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

3.集合类型

4.map类型

自定义解密过程

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

 validation模块注解校验

最后


版本更新记录

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

最新版本: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

对称加密配置项的可配置值

加密方式(encode)加密模式(mode)填充方式(padding)
SM4NONENoPadding
AESCBCZeroPadding
DESCFBISO10126Padding
DESedeCTROAEPPadding
CTSPKCS1Padding
ECBPKCS5Padding
OFBSSL3Padding
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<Integer>集合

加密前的请求参数:[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、@NotEmpty、@Size、@Null

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

@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 "";
}

最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity学习(七)授权

授权 什么是权限管理 权限管理核心概念 SpringSecurity权限管理策略 基于URL地址的权限管理 基于方法的权限管理 一、权限管理 二、授权核心概念 在认证的过程成功之后会将当前用户登录信息保存到Authentication对象中&#xff0c;Authentication对象中有一个getAuthorities…

ChatGPT-4震撼发布

3月15日消息&#xff0c;美国当地时间周二&#xff0c;人工智能研究公司OpenAI发布了其下一代大型语言模型GPT-4&#xff0c;这是其支持ChatGPT和新必应等应用程序的最新AI大型语言模型。该公司表示&#xff0c;该模型在许多专业测试中的表现超出了“人类水平”。GPT-4, 相较于…

基于Java+Springboot+vue高校资源共享交流平台设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

SpringBoot介绍。

目录 一、SpringBoot简介 1、SpringBoot开发步骤 2、官网构建工程 3、SpringBoot概述 二、配置文件 1、配置文件格式 2、yaml格式 3、yaml配置文件数据读取 三、多环境配置 1、yam文件 2、properties文件 3、命令行启动参数设置 四、SpringBoot整合 1、SpringBo…

界面开发(4)--- PyQt5实现打开图像及视频播放功能

PyQt5创建打开图像及播放视频页面 上篇文章主要介绍了如何实现登录界面的账号密码注册及登录功能&#xff0c;还简单介绍了有关数据库的连接方法。这篇文章我们介绍一下如何在设计的页面中打开本地的图像&#xff0c;以及实现视频播放功能。 实现打开图像功能 为了便于记录实…

OCPC系列 - OCPC介绍扫盲贴来啦

本文对oCPC做个介绍&#xff0c;它是一种智能投放模式&#xff0c;系统通过对广告主转化数据的对接和深度理解&#xff0c;实时预估每一次点击的转化率并基于竞争环境智能出价&#xff0c;通过强化高转化率曝光机会的获取&#xff0c;弱化低转化率曝光机会的展现&#xff0c;以…

力扣-进店却未进行过交易的顾客

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1581. 进店却未进行过交易的顾客二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行…

文心一言正式对标GPT-4,是青铜还是王者?

昨天&#xff0c;OpenAI正式发布GPT-4模型 号称史上最先进的AI系统 今天&#xff0c;百度文心一言在万众瞩目中闪亮登场 这款产品被视为中国版ChatGPT 在这一个多月内备受关注 文心一言某种程度上具有了对人类意图的理解能力 回答的准确性、逻辑性、流畅性都逐渐接近人类…

Go 微服务开发框架 DMicro 的设计思路

Go 微服务开发框架 DMicro 的设计思路 DMicro 源码地址: Gitee:dmicro: dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等 背景 DMicro 诞生的背景&#xff0c;是因为我写了 10 来年的 PHP&#xff0c;想在公司内部推广 Go, 公司内部的组件及 rpc 协议都…

多模态特征融合:图像、语音、文本如何转为特征向量并进行分类

多模态特征融合前言输入层&#xff0c;数据集转为特征向量图像语音什么是时域信号&#xff0c;什么是频域信号语音信号转换 - 1.傅立叶变换语音信号转换 - 2.梅尔频率倒谱系数文本词袋模型词嵌入模型输出层&#xff0c;多模态模型合并前言 学习多模态的话题可以从深度学习的分…

【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.57】引入可形变卷积

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv8&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…

[JS与链表]普通链表

为什么要用链表要储存一系列数据&#xff0c;最常用的数据结构是数组。数组有个缺点就是在中间插入或删除元素需要移动元素&#xff0c;成本很高。什么是链表链表也是有序元素的集合结构。链表中的元素在内存中并不是连续放置的。每个元素都可以理解为一个对象。包含了本身元素…

简单了解JSP

JSP概念与原理概念: Java Server Pages&#xff0c;Java服务端页面一种动态的网页技术&#xff0c;其中既可以定义 HTML、JS、CSS等静态内容&#xff0c;还可以定义Java代码的动态内容JSP HTML Java, 用于简化开发JSP的本质上就是一个ServletJSP 在被访问时&#xff0c;由JSP容…

博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)

博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接: 博途PLC 1200/1500PLC开放式以太网通信TSEND_C通信(UDP)_plc的udp通信_RXXW_Dor的博客-CSDN博客开放式TSEND_C通信支持TCP 、UDP等,关于TSEND_C的TCP通信可以参看下面这篇文章:博途PLC 1200/1500PLC开放式…

opencv识别车道线(霍夫线变换)

目录1、前言2、霍夫线变换2.1、霍夫线变换是什么&#xff1f;2.2、在opencv中的基本用法2.2.1、HoughLinesP函数定义2.2.2、用法3、识别车道3.1、优化3.1.1、降噪3.1.2、过滤方向3.1.3、截选区域3.2、测试其它图片3.2.1、代码3.2.2、图片13.2.3、图片23.2.4、图片31、前言 最近…

C++模拟实现红黑树

目录 介绍----什么是红黑树 甲鱼的臀部----规定 分析思考 绘图解析代码实现 节点部分 插入部分分步解析 ●父亲在祖父的左&#xff0c;叔叔在祖父的右&#xff1a; ●父亲在祖父的右&#xff0c;叔叔在祖父的左&#xff1a; 测试部分 整体代码 介绍----什么是红黑树 红…

2023年江苏省职业院校技能大赛中职网络安全赛项试卷-教师组任务书

2023年江苏省职业院校技能大赛中职网络安全赛项试卷-教师组任务书 一、竞赛时间 9:00-12:00&#xff0c;12:00-15:00&#xff0c;15:00-17:00共计8小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 基础设施设置与安全加固、网络安全事件响应、数…

链表相关oj题

1.Leetcode203 移除链表元素 解题思路&#xff1a;从头节点开始进行元素删除&#xff0c;每删除一个元素&#xff0c;需要重新链接节点 struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode*dummyheadmalloc(sizeof(struct ListNode));dummyhea…

spring5(四):IOC 操作 Bean 管理(基于注解方式)

IOC操作Bean管理&#xff08;基于xml方式&#xff09;前言一、注解1、概述二、入门案例1、Bean 的创建2、Bean的自动装配2.1 Autowired2、Qualifie3、Resource4、Value3、扫描组件3.1 配置文件版3.2 注解版4、测试前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心…

Mysql常用命令

mysql连接&#xff1a; [roothost]# mysql -u root -p Enter password:******创建数据库&#xff1a; CREATE DATABASE 数据库名&#xff1b; 删除数据库&#xff1a; drop database 数据库名; 使用mysqladmin删除数据库&#xff1a; [roothost]# mysqladmin -u root -p dr…