spring boot 接口参数解密和返回值加密
spring boot 接口参数解密和返回值加密
- 开发背景
- 简介
- 安装
- 配置
- yml 方式
- Bean 方式
- 试一下
- 启动项目
- 返回值加密
- 参数解密
- body 参数解密
- param和form-data参数解密
- 总结
开发背景
虽然使用 HTTPS 已经可以基本保证传输数据的安全性,但是很多国企、医疗、股票项目等仍然要求对接口数据进行自行加密,作者最近就遇到了,是支付宝对接国家医保的接口时,医保接口要求进行接口加密。
所以鉴于这个需求的存在,作者也找过现在的一些接口加密组件,发现都是3.4年前就已经停止更新了,并且不接受 pr 也不回复 issue 了,用起来也是功能简陋配置复杂,所以就开发了一套全新的组件。
作者对接口加密的各种需求了解的并不是很多,如果在使用中有功能缺失,欢迎来 Github 提 issue 或者 pr ❤️。
简介
SecureApi 是一款接口参数和返回值加解密工具,高性能、轻量化,无任何外部依赖;
spring boot 场景启动器设计(支持spring boot2和3),完全自动化,支持 param、body 参数(暂不支持 path 参数),用户无需关心加密解密和密钥匹配过程;
配置灵活,配置文件支持 yml 和 bean 方式,支持注解、url 正则进行接口匹配,支持 AES、SM4、RSA 等多种加密方式,支持 DH 前后端密钥协商方式。
用户增量趋势
此组件发布已经一两年了,发现有那么多用户,才重新整理了命名、仓库和文档
本篇只是先体验功能,使用请看官方文档: https://doc.xuyijie.icu/secure-api-doc/
Github地址: https://github.com/BubblingXuYijie/secure-api-spring-boot
Gitee地址(非主要,issue还是集中在Github比较好,大家都可以看到) https://gitee.com/BubblingXuYijie/secure-api-spring-boot
一些问题你们会在文档
中或者Github的issue
里找到答案,如果你不知道前端如何配合,那么文档里有你想要的东西
安装
环境要求:
- jdk8+(spring boot 3 请使用 jdk17+)
- Maven/Gradle
- spring boot 2+(spring boot 3 请引入 SecureApi 的 3.0.0+ 版本)
Maven
<!-- https://mvnrepository.com/artifact/icu.xuyijie/secure-api-spring-boot-starter -->
<dependency><groupId>icu.xuyijie</groupId><artifactId>secure-api-spring-boot-starter</artifactId><!--spring boot 3 请引入 3.0.2 版本--><version>2.0.9</version>
</dependency>
Gradle
// spring boot 3 请引入 3.0.2 版本
implementation 'icu.xuyijie:secure-api-spring-boot-starter:2.0.9'
配置
有两种配置方法,
yml
和Bean
方式,看你喜欢哪一个,如果是对安全性要求较高,建议使用Bean
方式动态设置密钥,而不是写在yml
里。
yml 方式
下面是 yml 的完整配置,有些配置项是可选的,在注解中均已解释
secure-api:# 开启SecureApi功能,如果为false则其余配置项均不生效enabled: true# 生成的key和密文等是否是符合url规范的url-safe: true# 开启加解密日志打印,会打印出接口名、加密模式、算法、明文和密文等信息show-log: true# 加密模式,common和session_key可选,session_key是会话密钥模式,用于每次请求都使用不同的密钥,需要前端配合mode: common# 加密算法cipher-algorithm: rsa_ecb_sha256# session_key模式配置项,与前端协商的会话密钥类型,common模式下此配置不生效session-key-cipher-algorithm: aes_ecb_pkcs5# 对称算法用于加解密的密钥,cipher-algorithm选择对称加密算法时配置,也可为空,组件会随机生成一个key:# 对称算法用于加解密的偏移量,cipher-algorithm选择对称加密算法时配置,也可为空,组件会随机生成一个iv:# 非对称算法用于加密的公钥,cipher-algorithm选择非对称加密算法时配置,也可为空,组件会随机生成一对public-key:# 非对称算法用于解密的私钥,cipher-algorithm选择非对称加密算法时配置,也可为空,组件会随机生成一对private-key:# 需要加密的接口路径匹配,遵循spring boot拦截器的正则规则,留空或者不配置代表不使用url匹配,只对注解的接口进行解密encrypt-url:# 配置了此项,接口有无注解都将进行返回值加密include-urls: /**# 即使配置了排除,注解的优先级也高于此项exclude-urls:# 需要解密的接口路径匹配,遵循spring boot拦截器的正则规则,留空或者不配置代表不使用url匹配,只对注解的接口、参数、字段进行解密decrypt-url:# 配置了此项,接口、参数、字段有无注解都将进行解密include-urls: /**# 即使配置了排除,注解的优先级也高于此项exclude-urls:
Bean 方式
注意,一旦使用了
Bean
方式来配置,yml
里的配置项都将失效
import icu.xuyijie.secureapi.cipher.CipherAlgorithmEnum;
import icu.xuyijie.secureapi.cipher.CipherUtils;
import icu.xuyijie.secureapi.cipher.RsaKeyPair;
import icu.xuyijie.secureapi.model.SecureApiProperties;
import icu.xuyijie.secureapi.model.SecureApiPropertiesConfig;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;import java.util.ArrayList;
import java.util.Arrays;@SpringBootConfiguration
public class SecureApiConfig {/*** 这里的配置了Bean会导致yml配置的数据失效* @return SecureApiPropertiesConfig*/@Beanpublic SecureApiPropertiesConfig secureApiPropertiesConfig() {SecureApiPropertiesConfig secureApiPropertiesConfig = new SecureApiPropertiesConfig();secureApiPropertiesConfig.setEnabled(true);secureApiPropertiesConfig.setUrlSafe(true);secureApiPropertiesConfig.setShowLog(true);secureApiPropertiesConfig.setMode(SecureApiProperties.Mode.COMMON);secureApiPropertiesConfig.setCipherAlgorithmEnum(CipherAlgorithmEnum.RSA_ECB_SHA256);// 密钥可以不设置,组件会自动生成一个,并打印在控制台,如果需要手动生成,只需要使用组件提供的CipherUtilsCipherUtils cipherUtils = new CipherUtils(CipherAlgorithmEnum.RSA_ECB_SHA256);// 因为我们选择的是非对称加密RSA,所以生成一个密钥对,getRandomRsaKeyPair("1")可传入seed参数,在测试时可用于控制每次生成的密钥相同RsaKeyPair randomRsaKeyPair = cipherUtils.getRandomRsaKeyPair();// 把生成的密钥对设置到secureApiPropertiesConfigsecureApiPropertiesConfig.setPublicKey(randomRsaKeyPair.getPublicKey());secureApiPropertiesConfig.setPrivateKey(randomRsaKeyPair.getPrivateKey());// 不需要使用url匹配功能可以删除掉下面两行,或者传入空数组// secureApiPropertiesConfig.setEncryptUrl(new SecureApiProperties.UrlPattern(Arrays.asList("/**"), new ArrayList<>()));// secureApiPropertiesConfig.setDecryptUrl(new SecureApiProperties.UrlPattern(Arrays.asList("/**"), Arrays.asList("/secureApiTest/testForm")));return secureApiPropertiesConfig;}
}
试一下
好了各位大佬们,到了这里,配置以及完成,接下来可以进行效果体验了,后面有时间会提供前后端的 demo。
本篇只是先体验功能,请务必和我的代码相同,不然也许你会遇到一些问题,代码里使用的注解等看文档会介绍,可以解决你的疑惑。
启动项目
SecureApi的
enable
设置为true
时,控制台会打印以下信息,代表开启接口加解密功能,我这里没有指定 key ,所以组件为我自动生成了,然后你可以把密钥设置到前端或者和前端进行密钥协商以追求更安全的传输。
建议测试的时候使用
CipherUtils
手动设置密钥,可以指定seed
保证每次生成的密钥相同,更加方便。
返回值加密
前面我们没有配置url匹配,需要在接口上或者接口所在类上添加
@EncryptApi
注解,即可实现返回值加密
可以看到由于我开启了日志打印功能,控制台打印出一些信息
接口返回的是一个 json 字符串,然后前端使用对应密钥解密这个字符串(注意这是个json字符串,前端处理时应该去除前后两端引号)就可以拿到
{"code":200,"message":"哈哈哈","data":null}
这样的对象了
参数解密
body 参数解密
组件可以对json参数体进行解密,这次我们传入上一步中加密的返回值,看一看解密结果,接口需要添加
@DecryptApi
注解,这样这个接口既会解密参数,也会加密返回值
使用
Postman
发送密文body参数
可以看到密文参数正常解密为
{"code":200,"message":"哈哈哈","data":null}
,返回值也成功加密了
param和form-data参数解密
这一次我们整复杂一点,各种类型的参数都整上,没有开启url匹配,我们要给字段加上
@DecryptParam
注解,注意@DecryptParam
不能和@RequestParam
同时使用,@DecryptParam
已经替代了后者功能。
实体类本身不需要加注解,要加在里面的字段上,注意,没有加注解的字段不会解密(配置了url匹配的话,加不加注解全部字段都会解密)
发送请求,请求中这些密文都是我提前用代码生成好的(注意,param里的密文要是url safe的),这些参数放在 param 里或者放在 form-data 里发送都是可以的
成功解密加了注解的参数,没有加注解和为null的参数不解密
总结
本篇只是先体验功能,使用请看官方文档: https://doc.xuyijie.icu/secure-api-doc/
Github地址: https://github.com/BubblingXuYijie/secure-api-spring-boot
Gitee地址(非主要,issue还是集中在Github比较好,大家都可以看到) https://gitee.com/BubblingXuYijie/secure-api-spring-boot
一些问题你们会在文档
中或者Github的issue
里找到答案,如果你不知道前端如何配合,那么文档里有你想要的东西
相关文章:

spring boot 接口参数解密和返回值加密
spring boot 接口参数解密和返回值加密 开发背景简介安装配置yml 方式Bean 方式 试一下启动项目返回值加密参数解密body 参数解密param和form-data参数解密 总结 开发背景 虽然使用 HTTPS 已经可以基本保证传输数据的安全性,但是很多国企、医疗、股票项目等仍然要求…...

C语言自定义类型——联合体、枚举
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、联合体(一)、联合体的声明(二)、联合体的特点(三)、联合体大小的计算!&a…...
【trition-server】pytorch 文档:使用 Triton 提供 Torch-TensorRT 模型
Serving a Torch-TensorRT model with Triton pytorch 的官方文档: Serving a Torch-TensorRT model with Triton 在有关机器学习基础设施的讨论中,优化和部署是密不可分的。一旦完成网络级优化以获得最大性能,下一步就是部署它。 然而,提供这种优化模型也有其自身的一系列…...
wps 表格如何实现vlookup高级模糊搜索
一、VLOOKUP 模糊搜索 在 WPS 表格中,可以通过使用 VLOOKUP 函数和通配符来实现高级模糊搜索。这里有一个具体的示例来帮助你理解如何进行这些操作。 示例:实现 VLOOKUP 高级模糊搜索 假设我们有以下数据集: AB产品编号产品名称001苹果00…...

第一天(点亮led灯+led灯闪烁)——Arduino uno R3 学习之旅
常识: 一般智能手机的额定工作电流大约为200mA Arduino Uno板上I/0(输入/输出)引脚最大输出电流为40 mA Uno板控制器总的输出电流为200 mA 点亮LED灯 发光二极管介绍 发光二极管(Light Emitting Diode,简称LED)是一种能够将电能转化为光能的固态的半导体器件…...

【C++题解】1561. 买木头
问题:1561. 买木头 类型:省赛、数组问题、二分答案、贪心、2015江苏省青少年信息学奥林匹克竞赛复赛 题目描述: 有 n 个木材供应商,每个供货商有长度相同一定数量的木头。长木头可以锯短,但短木头不能接长。有一个客…...
解决android native包webview,webview中的请求blocked by CORS policy
在stack overflow查,差不多查到的都是些webView.getSettings().setxxx,没用。在github上找别的类似的android native包webview运行pwa的项目,把它们的webView.getSettings().setxxx全搬过来,写了有一页多,一个有用的都…...

链篦机回转窑球团生产工艺
生球在回转窑氧化焙烧,回转窑头部设有燃烧器,燃料可以采用气体、固体、液体。 来自环冷机一冷却段的高温废气作为二次风进入窑内参与燃烧,烧成成品球进入环冷机。 环冷机采用鼓风冷却,热风风箱分为四段: 一段气体引至…...

查看电脑ip地址快捷键是什么?是哪个
在网络世界中,IP地址是每个网络设备的唯一标识,无论是我们的电脑、手机还是其他联网设备,都需要一个独特的IP地址来进行通讯。在日常生活和工作中,我们有时需要查看电脑的IP地址,以便进行网络设置、故障排查或远程连接…...
面试专区|【54道Spring Cloud高频题整理(附答案背诵版)】
什么是Spring Cloud? Spring Cloud是一个基于Spring Boot的开源框架,它提供了在分布式系统中集成各种服务治理功能的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态等。其主要目…...

Shopee(虾皮)怎么获取流量?
店铺流量的高低会直接关联到卖家店铺单量,也关系到一个店铺的营业情况和利润,那么Shopee的流量从哪里来呢? Shopee的平台流量可分为五个部分: 1.自然流量 2.关键字广告流量 3.平台活动流量 4.营销流量 5.粉丝流量 怎么提升…...

Java启动虚拟机默认字符集编码
-Dfile.encodingUTF-8 java程序启动默认字符集编码参数 // 这里会创建一个Charset.defaultCharset().name()的流,在Windows命令行窗口启动,会出现字符编码为GBK的情况 // 导致乱码输入、输出都会有影响 // 解决办法流的读取指定编码new InputStreamRead…...
【单片机编程模式】状态机编程
状态机编程是一种编程模式,它基于有限状态机(Finite State Machine,简称FSM)的概念。以下是状态机编程的清晰解释,分点表示和归纳: 基本概念: 状态机是一个有向图形,由一组节点&…...

IPSS模块怎么安装到VOS服务器的,到底有没有效果,是不是能大幅度提升VOS3000安全性呢
由于VOS的普及性,不得不承认VOS确实是非常优秀的软交换,但是很多客户在使用过程中都会遇到各种安全问题,比如话费被盗用了,历史话单一堆的非法呼叫话单,严重的影响到了话务安全,并不是那点话费的事了&#…...
C++ STL容器:序列式容器-堆pirority_queue
摘要: CC STL(Standard Template Library,标准模板库)在C编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...

ECharts在最新版本中使用getInstanceByDom报错处理
引用问题导致报错 如果按如下引用的话,会报错 import echarts from “echarts/lib/echarts”; 原因 在 ECharts 的之前版本中,默认导出了一个名为 echarts 的对象,所以使用 import echarts from “echarts” 是没有问题的。但是在 ECharts …...

利用C语言实现三子棋游戏
文章目录 1.游戏界面2.游戏内容2.1 棋盘类型2.2棋盘的初始化2.3 打印棋盘的界面展示 3.游戏操作3.1 玩家操作3.2 电脑操作3.3 胜负判定 4.代码整合 1.游戏界面 无论写任何程序,我们都需要先去了解它的大概框架,这里我们先把它的初始界面写出来。一个游戏…...

大学教师门诊预约小程序-计算机毕业设计源码73068
摘要 在当今数字化、信息化的浪潮中,大学校园的服务管理正朝着智能化、便捷化的方向迈进。为了优化大学教师的医疗体验,提升门诊预约的效率和便捷性,我们基于Spring Boot框架设计并实现了一款大学教师门诊预约小程序。该小程序不仅提供了传统…...
Python PyCryptodome库介绍与实例
Python PyCryptodome库介绍与实例 1. 安装2. 基本概念3. 使用场景和示例代码3.1 对称加密 - AES3.2 非对称加密 - RSA3.3 哈希函数 - SHA2563.4 消息认证码 - HMAC 4. 总结 PyCryptodome是一个强大的Python加密库,提供了各种加密算法和工具。本文将介绍PyCryptodome的基本概念和…...
《框架封装者 · 自定义初始化事件》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...