spring boot 接口参数解密和返回值加密

news2025/4/21 11:38:33

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等多种加密方式,支持DM前后端密钥协商方式。

用户增量趋势

此组件发布已经一两年了,发现有那么多用户,才重新整理了命名、仓库和文档

在这里插入图片描述

本篇只是先体验功能,使用请看官方文档: 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'

配置

有两种配置方法, ymlBean 方式,看你喜欢哪一个,如果是对安全性要求较高,建议使用 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
     */
    @Bean
    public 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);
        
        // 密钥可以不设置,组件会自动生成一个,并打印在控制台,如果需要手动生成,只需要使用组件提供的CipherUtils
        CipherUtils cipherUtils = new CipherUtils(CipherAlgorithmEnum.RSA_ECB_SHA256);
        // 因为我们选择的是非对称加密RSA,所以生成一个密钥对,getRandomRsaKeyPair("1")可传入seed参数,在测试时可用于控制每次生成的密钥相同
        RsaKeyPair randomRsaKeyPair = cipherUtils.getRandomRsaKeyPair();
        // 把生成的密钥对设置到secureApiPropertiesConfig
        secureApiPropertiesConfig.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里找到答案,如果你不知道前端如何配合,那么文档里有你想要的东西

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SEELE框架:图像中主体重定位的创新方法

现有的图像编辑工具多集中于静态调整&#xff0c;如替换图像中的特定区域或改变整体风格&#xff0c;对于动态调整——特别是图像中主体的位置变化则显得力不从心。这种局限性激发了对更加先进和灵活的图像编辑技术的探索。复旦大学数据科学学院的研究团队提出了一种名为SEELE的…

ZW3D二次开发_CAM_设置参数并输出NC文件

ZW3D可以输出NC文件&#xff0c;代码示例如下&#xff1a; int index;int ret cvxCmInqIndexFromName(CM_OUT, (char*)"NC", &index);//获取参数svxNcSetting ncSet;ret cvxCmGetOutputNCSet(index, &ncSet);//设置参数strcpy_s(ncSet.filename, "C:\…

4个免费文章生成器,为你免费一键生成原创文章

在当今的创作领域&#xff0c;创作者们常常陷入各种困境。灵感的缺失、内容创新的压力&#xff0c;每一项都如同沉重的枷锁&#xff0c;束缚着他们的创作步伐。但随着免费文章生成器的出现&#xff0c;宛如一场及时雨&#xff0c;为创作者们带来了新的希望和转机。免费文章生成…

Runway Gen-3 实测,这就是 AI 视频生成的 No.1!视频高清化EvTexture 安装配置使用!

Runway Gen-3 实测,这就是 AI 视频生成的 No.1!视频高清化EvTexture 安装配置使用! 由于 Runway 作为一个具体的工具或平台,其详细信息在搜索结果中没有提供,我将基于假设 Runway 是一个支持人工智能和机器学习模型的创意工具,提供一个关于使用技巧和类似开源项目的文稿总…

上网行为管理系统是什么?有哪些好用的上网行为管理系统?

IT经理&#xff08;ITM&#xff09;: 大家好&#xff0c;今天我们聚在这里&#xff0c;是为了讨论一个对我们公司来说越来越重要的议题&#xff1a;上网行为管理系统&#xff08;WBS&#xff09;。我们知道&#xff0c;员工的网络使用已经不仅仅是个人行为&#xff0c;它直接影…

S32K3 工具篇4:如何在S32DS中使用lauterbach下载

S32K3 工具篇4&#xff1a;如何在S32DS中使用lauterbach下载 1. TRACE32软件下载与配置2. 如何在S32DS里面构建劳德巴赫的接口2.1 新建工程带有lauterbach2.2 已有工程没有lauterbach 劳德巴赫lauterbach是一款非常经典强悍的调试器&#xff0c;还带有trace功能&#xff0c;在汽…

CAN_TxStatus_Pending报错问题

最近用STM32F407最小电路板测试CAN通讯遇到点小问题&#xff1a;回环模式测试没有问题的基础上&#xff0c;两块相同的最小系统板之间也可以通讯。但把其中一块板子换成USB转CAN分析仪时(或者其他板子)&#xff0c;怎么也调不通。 思考良久&#xff0c;硬件测试正常&#xff0c…

只需几个演示就能对齐大模型,杨笛一团队提出的DITTO竟如此高效

人类的教育方式&#xff0c;对大模型而言也很适用。 养育孩子时&#xff0c;古往今来人们都会谈到一种重要方法&#xff1a;以身作则。也就是让自己成为孩子模仿学习的范例&#xff0c;而不是单纯地告诉他们应该怎么做。在训练大语言模型&#xff08;LLM&#xff09;时&#xf…

防勒索病毒袭击,及时定期备份势在必行——易备防勒索备份成功案例

上海某贸易有限公司是于 2010 年 6 月在上海成立的全日资企业&#xff0c;注册资金一亿日元。总公司位于日本东京&#xff0c;从事独立开发制造和销售使用纯天然的植物制成的化妆品、健康食品、日用小商品。 该公司使用用友优普 U8 供应链及电商系统&#xff0c;该系统部署于阿…

CV02_超强数据集:MSCOCO数据集的简单介绍

1.1 简介 MSCOCO数据集&#xff0c;全称为Microsoft Common Objects in Context&#xff0c;是由微软公司在2014年推出并维护的一个大规模的图像数据集&#xff0c;旨在推动计算机视觉领域的研究&#xff0c;尤其是目标识别、目标检测、实例分割、图像描述生成等任务。该数据集…

什么是OSPFv2 ?

什么是OSPF ? 开放式最短路径优先 OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用的是OSPF Version 2&#xff08;RFC2328&#xff09;&a…

CAN总线(上)

CAN总线&#xff08;Controller Area Network Bus&#xff09;控制器局域网总线 CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线&#xff0c;广泛应用于汽车、嵌入式、工业控制等领域 CAN总线特征&#xff1a; 两根通信线&#xff08;…

mars3d加载wms服务或者wmts服务注意事项

1.wms只支持4326、3857、4490的标准切片&#xff0c;其他坐标系不支持 Mars3D三维可视化平台 | 火星科技 2.wmts同理&#xff0c;Mars3D三维可视化平台 | 火星科技 3.对应级别tilematrix找到的瓦片tilerow&tilecol这两个参数使用常见报错无效参考&#xff1a; 【Mars3d】…

JAVA 八大warrp包装类

一、介绍 二、自动拆箱与手动拆箱 //jdk5前是手动装箱和拆箱//手动装箱 int -> Integerint n1 100;Integer integer new Integer(n1);//只要new就shibuInteger integer1 Integer.value0f(n1)//手动拆箱//Integer -> intint i integer.intValue(); ​//jdk5后&#xff…

源代码防泄漏之反向沙箱方案的经验分享

反向沙箱&#xff08;Reverse Sandbox&#xff09;是一种安全技术&#xff0c;主要用于检测和分析恶意软件的行为。与传统沙箱不同&#xff0c;反向沙箱的重点在于模拟恶意软件的预期运行环境&#xff0c;以诱导恶意软件展示其真实行为。这种技术可以帮助安全专家更深入地理解恶…

Leaflet【六】绘制交互图形、测量、经纬度展示

本文主要探讨了如何利用leaflet-draw插件在地图上绘制图形&#xff0c;以及通过leaflet-measure测量距离和面积&#xff0c;并将经纬度绘制到地图上。首先&#xff0c;我们使用leaflet-draw插件&#xff0c;该插件提供了一种简单而直观的方式来绘制各种形状&#xff08;如点、线…

【K8s】专题六(4):Kubernetes 稳定性之初始化容器

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本介绍 二、主要特点 三、资源清单&#xff08;示例&#xff09; 一、基本介绍 初…

C电池 和 D 电池的作用和类型详解及其之间的区别

C 和 D 电池是我们日常生活中必不可少的部件。它们通常用于高功率设备。例如手电筒和玩具。 D 型电池和 C 型电池是两种常见的电池类型。它们是一次性圆柱形电池。您可以在很多设备上使用它们。虽然它们有很多相似之处&#xff0c;但它们也有不同的特点。这些特点使它们适合某…

Redis 多数据源自定义配置 Spring Boot 升级版

文章目录 1.前言2.git 示例地址3.需求4.代码实现4.1 application.properties 配置文件4.2 获取 application.properties 中的 redis 配置4.2.1 Environment 对象来获取自定义 redis 配置 4.3 初始化 RedisTemplate 对象&#xff0c;并注册到 Spring IOC 容器4.3.1 初始化方法4.…

Python函数语法详解(与C++对比学习)【未完】

一、Python函数的形式 def function_name (参数, ...) -> return value_type:# 函数体return value# 看具体需求# 如果没有return语句&#xff0c;函数执行完毕后也会返回结果# 只是结果为None。return None可以简写为return 1. Python的返回值 在Python3中&#xff0c;提…