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

文章摘要:前言:之前工作中做过两个功能,就是之前写的这两篇博客,最近几天有个想法,给它做成一个springboot的start启动器,直接引入依赖,写好配置就能用了
springboot使用自定义注解实现接口参数解密,普通字段,json,集合
使用反射实现@RequestBody的参数校验功能
—————
现在,它来了。
项目地址:
gitee:https://gitee.com/vhukze/master-key
github:https://github.com/vhukze/master-key
目录
版本更新记录
最新版本:1.2
介绍
软件架构
配置教程
1.引入依赖
2.配置
3.注意事项
使用说明
不同传参方式示例
不同参数类型示例
自定义解密过程
validation模块注解校验
最后
版本更新记录
更新的功能具体使用示例已经更新到博文中,请在目录中找到对应位置查看
最新版本:1.2
新增全局解密配置和忽略解密注解;
新增自定义解密过程接口;
介绍
用来实现接口参数解密的工具,只需引入依赖,在配置文件写明加密的配置,在接口上使用指定注解即可实现该接口的参数解密。并支持使用validation模块的注解进行参数校验,支持分组校验功能
支持的对称加密方式:SM4,AES,DES,DESede 支持的非对称加密方式:RSA,SM2
软件架构
使用java8,springboot2.x.x,一个简单的springboot starter 启动器,功能中用到的工具类是hutool
配置教程
1.引入依赖
io.github.vhukze
master-key-spring-boot-starter
目前最新版本
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(Listresolvers) {
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)
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国密加密算法时,需要引入国密加密的依赖 如下
org.bouncycastle
bcprov-jdk15to18
1.69
使用说明
支持自定义实体类、基础数据类型及其包装类、集合类型。加密前参数格式跟正常请求接口时相同
不同传参方式示例
例如当前接口所需参数为:{"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]
实际请求
接口接收到的参数
自定义解密过程
新建一个类实现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("\\)", "");
}
}
实际请求
接口接收到的参数
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 "";
}
最后
目前就有这些功能,后面如果有需要的话,准备加入Map类型参数的解密、不同接口使用不同解密方式等功能
————————————————
版权声明:本文为CSDN博主「阿演」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41890624/article/details/129449113
项目地址:
gitee:https://gitee.com/vhukze/master-key
github:https://github.com/vhukze/master-key
目录
版本更新记录
最新版本:1.2
介绍
软件架构
配置教程
1.引入依赖
2.配置
3.注意事项
使用说明
不同传参方式示例
不同参数类型示例
自定义解密过程
validation模块注解校验
最后
版本更新记录
更新的功能具体使用示例已经更新到博文中,请在目录中找到对应位置查看
最新版本:1.2
新增全局解密配置和忽略解密注解;
新增自定义解密过程接口;
介绍
用来实现接口参数解密的工具,只需引入依赖,在配置文件写明加密的配置,在接口上使用指定注解即可实现该接口的参数解密。并支持使用validation模块的注解进行参数校验,支持分组校验功能
支持的对称加密方式:SM4,AES,DES,DESede 支持的非对称加密方式:RSA,SM2
软件架构
使用java8,springboot2.x.x,一个简单的springboot starter 启动器,功能中用到的工具类是hutool
配置教程
1.引入依赖
io.github.vhukze
master-key-spring-boot-starter
目前最新版本
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(Listresolvers) {
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)
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国密加密算法时,需要引入国密加密的依赖 如下
org.bouncycastle
bcprov-jdk15to18
1.69
使用说明
支持自定义实体类、基础数据类型及其包装类、集合类型。加密前参数格式跟正常请求接口时相同
不同传参方式示例
例如当前接口所需参数为:{"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]
实际请求
接口接收到的参数
自定义解密过程
新建一个类实现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("\\)", "");
}
}
实际请求
接口接收到的参数
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 "";
}
最后
目前就有这些功能,后面如果有需要的话,准备加入Map类型参数的解密、不同接口使用不同解密方式等功能
————————————————
版权声明:本文为CSDN博主「阿演」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41890624/article/details/129449113
相关内容推荐
机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1
机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设备测试1机械设
2023.03.14
1382次浏览
