当前位置: 首页 > news >正文

Spring Boot项目怎么对System.setProperty(key, value)设置的属性进行读取加解密

一、前言

之前我写过一篇文章使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密),对Spring Boot项目的属性读取时进行加解密,但是没有说明对System.setProperty(key, value)设置的属性进行读取加解密,这个在开发过程中应该怎么实现呢?

二、开发方案

前置步骤我们在这里不再描述了,可以参考使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密),我们这里参考一下解决方案。

1. 通过扩展EnvironmentPostProcessor接口进行参数解密

1.1 示例代码
import com.learn.SM4Utils; // 自己实现的SM4算法工具类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;import java.util.Map;
import java.util.Properties;
import java.util.Set;public class MyEnv implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {// 获取所有系统参数Properties properties = System.getProperties();// 遍历Set<Map.Entry<Object, Object>> entries = properties.entrySet();for (Map.Entry<Object, Object> entry : entries) {// 获取设置值Object value = entry.getValue();if (value != null) {String v = (String) value;if (v.startsWith(SM4Utils.SM4_PREFIX)) { // 判断是否进行了加密配置// 进行解密,然后重新设置System.setProperty((String) entry.getKey(), SM4Utils.decryptStr(v));}}}}
}
1.2 注册自定义EnvironmentPostProcessor处理器

resource目录下新建META-INF目录,新建spring.factories文件,添加如下内容:

org.springframework.boot.env.EnvironmentPostProcessor=\com.learn.env.MyEnv
1.3 测试

示例代码:

SpringBootApplication
public class JenkinsDemo01Application {public static void main(String[] args) {String s = SM4Utils.encryptStr("hello,CSDN!");System.out.println("设置的value:" + s);System.setProperty("testKey", s);SpringApplication.run(JenkinsDemo01Application.class, args);System.out.println("获取的value:" + System.getProperty("testKey"));}}

测试结果:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=Spring%20Boot%E9%A1%B9%E7%9B%AE%E6%80%8E%E4%B9%88%E5%AF%B9System.setProperty(key%2C%20value&pos_id=img-KCqrwIPP-1708434412477)设置的属性进行读取加解密.assets/image-20240220210228771.png
)

2. 通过实现ApplicationListener事件监听实现

2.1 示例代码
import com.learn.SM4Utils;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;import java.util.Map;
import java.util.Properties;
import java.util.Set;public class MyEventListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {@Overridepublic void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {// 获取所有系统参数Properties properties = System.getProperties();// 遍历Set<Map.Entry<Object, Object>> entries = properties.entrySet();for (Map.Entry<Object, Object> entry : entries) {// 获取设置值Object value = entry.getValue();if (value != null) {String v = (String) value;if (v.startsWith(SM4Utils.SM4_PREFIX)) { // 判断是否进行了加密配置// 进行解密,然后重新设置System.setProperty((String) entry.getKey(), SM4Utils.decryptStr(v));}}}}
}
1.2 注册自定义ApplicationListener事件监听

resource目录下新建META-INF目录,新建spring.factories文件,添加如下内容:

org.springframework.context.ApplicationListener=\com.learn.event.MyEventListener
1.3 测试

示例代码:

SpringBootApplication
public class JenkinsDemo01Application {public static void main(String[] args) {String s = SM4Utils.encryptStr("hello,CSDN!");System.out.println("设置的value:" + s);System.setProperty("testKey", s);SpringApplication.run(JenkinsDemo01Application.class, args);System.out.println("获取的value:" + System.getProperty("testKey"));}}

测试结果:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=Spring%20Boot%E9%A1%B9%E7%9B%AE%E6%80%8E%E4%B9%88%E5%AF%B9System.setProperty(key%2C%20value&pos_id=img-CTO9Ca5D-1708434412478)设置的属性进行读取加解密.assets/image-20240220210228771.png

通过以上两种方式,可以在项目启动过程中获取设置System参数,进行解密,这样获取的时候就是解密以后的参数了。

相关文章:

  • 02 环境配置
  • 并发编程入门指南
  • Sectigo多域名ssl证书加域名贵吗
  • c# 线性代数 克·施密特(Gram Schmidt)
  • Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序
  • vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度
  • 【Docker】基于yum安装docker
  • uniapp富文本文字长按选中(用于复制,兼容H5、APP、小程序三端)
  • 代码随想录算法训练营|day32
  • MySQL篇—事务和隔离级别介绍
  • CTFHub技能树web之RCE(二)
  • 【LeetCode】递归精选8题——基础递归、链表递归
  • Android | ArcGIS入门
  • FreeRTOS学习笔记——(FreeRTOS临界段代码保护及调度器挂起与恢复)
  • C#,洗牌问题(Card Shuffle Problem)的算法与源代码
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • css布局,左右固定中间自适应实现
  • in typeof instanceof ===这些运算符有什么作用
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JS数组方法汇总
  • JS专题之继承
  • k个最大的数及变种小结
  • Lsb图片隐写
  • scala基础语法(二)
  • session共享问题解决方案
  • TypeScript迭代器
  • vue自定义指令实现v-tap插件
  • 猴子数据域名防封接口降低小说被封的风险
  • 免费小说阅读小程序
  • 前端路由实现-history
  • 事件委托的小应用
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #控制台大学课堂点名问题_课堂随机点名
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4) PIVOT 和 UPIVOT 的使用
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (五)Python 垃圾回收机制
  • (小白学Java)Java简介和基本配置
  • .NET大文件上传知识整理
  • .NET企业级应用架构设计系列之技术选型
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [1]-基于图搜索的路径规划基础
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [hive小技巧]同一份数据多种处理
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [JavaWeb]—前端篇
  • [LeetCode]-Spiral Matrix III 螺旋矩阵