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参数,进行解密,这样获取的时候就是解密以后的参数了。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5 Nacos本地启动配置

1、修改启动配置 修改nacos-console模块的application.properties,具体如下: 其中,url参数详见链接:

使用AndroidStudio调试Framework

1.前言 最近在工作过程中&#xff0c;涉及到FW的一些修改&#xff0c;比如PhoneWindowManager&#xff0c;只能通过加日志看打印的方式查看一些内容&#xff0c;比较低效&#xff0c;所以想了解一下FW的调试方式&#xff0c;后来发现AS就可以调试FW.我平时都是在Docker服务器编…

多目图像拼接算法

图像拼接一般要经过图像特征提取、特征匹配、融合等步骤来实现。 特征匹配与变换: SIFT(尺度不变特征变换)SURF(加速鲁棒特征)ORB(Oriented FAST and Rotated BRIEF)AKAZE(加速的KAZE特征)全景图像拼接算法: 基于特征匹配的拼接:利用特征点匹配找到重叠区域,然后进…

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络&#xff0c;也称为多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff0c;是一种常见的神经网络模型&#xff0c;用于解决各种机器学习问题&#xff0c;包括分类和回归。BP 代表“反向传播”&#xff08;Backpropagation&#…

【Go map的底层实现原理?】

Go中的map是一个指针&#xff0c;占用8个字节&#xff0c;指向hmap结构体 源码包中src/runtime/map.go定义了hmap的数据结构&#xff1a; hmap包含若干个结构为bmap的数组&#xff0c;每个bmap底层都采用链表结构&#xff0c;bmap通常叫其bucket hmap结构体 // A header for…

Linux中alarm/setitimer函数(信号函数)

alarm函数 函数原型&#xff1a; unsigned int alarm(unsigned int seconds); 函数描述&#xff1a;设置定时器&#xff08;闹钟&#xff09;。在指定seconds后&#xff0c;内核会给当前进程发送 14&#xff09;SIGALRM信号。进程收到该信号&#xff0c;默认动作终止。每个进程…

判断一个dll/exe是32位还是64位

通过记事本判断&#xff08;可判断C或者C#&#xff09; 64位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第一个PE&#xff0c;如果后面是d?则为64位 32位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第…

服务网格Service Mesh和Istio

文章目录 服务网格&#xff08;Service Mesh&#xff09;市场上三种服务网格解决方案服务网格的特征流量管理安全性可观察性 Istio简介Istio提供了什么功能服务 &#xff1f;Istio 核心特性流量管理安全可观察性 平台支持 服务网格&#xff08;Service Mesh&#xff09; 服务网…

【Linux】Linux调试器-gdb使用

1. 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 开始使用 gdb binFile 退出&#xff1a; ctrl d 或 quit 调…

【JGit】分支管理实践

本文紧接【JGit】简述及学习资料整理。 以下梳理了使用 JGit 进行 Git 操作的实践 JGit实践 主函数 public static void main(String[] args) throws Exception {String localDir "D:\\tmp\\git-test\\";String gitUrl "http://192.168.181.1:3000/root/g…

我的音乐伙伴:南卡、韶音、墨觉三款热门骨传导耳机体验分享

作为一个热爱运动的音乐爱好者。对我来说&#xff0c;没有什么能比在运动时配上心爱的歌曲更让人兴奋的了。不管是清晨的跑步&#xff0c;还是傍晚的散步&#xff0c;音乐总能激发我更多的能量。但是&#xff0c;找到既能陪伴我完成高强度训练&#xff0c;又不失音质的耳机&…

从物联网到数字孪生:智慧社区的演变

随着科技的飞速发展和数字化转型的深入推进&#xff0c;智慧社区已成为提升城市治理水平和居民生活质量的重要方向。在这一演变过程中&#xff0c;物联网和数字孪生技术起到了至关重要的作用。本文将深入探讨从物联网到数字孪生的演变过程&#xff0c;分析这一转变对智慧社区建…

JVM原理学习

一.栈上的数据存储P95 二.堆上的数据存储 标记字段 指针压缩(节省空间 内存对齐(提高CPU缓存行效率 字段重排列方便内存对齐 类排在基本类型之后 三.JIT实时编译 优化手段 C2编译器&#xff0c;直接将循环相加求和优化为乘法。 方法内联 逃逸分析 四.G1垃圾回收器原理 年轻代…

【快速搞定Webpack5】基本配置及开发模式介绍(二)

在开始使用webpack之前么&#xff0c;我们需要对Webpack的配置有一定的认识。 一、5大核心概念 1. enty&#xff08;入口&#xff09; 指示webpack从哪个文件开始打包 2. output&#xff08;输出&#xff09; 指示webpack打包完的文件输出到哪里去&#xff0c;如何命名等 …

【自然语言处理】seq2seq模型—机器翻译

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

ChatGPT魔法1: 背后的原理

1. AI的三个阶段 1&#xff09; 上世纪50~60年代&#xff0c;计算机刚刚产生 2&#xff09; Machine learning 3&#xff09; Deep learning&#xff0c; 有神经网络&#xff0c; 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…

Nginx缓存相关配置解析

文章目录 前言配置示例proxy_cacheproxy_cache_pathproxy_cache_keyproxy_cache_validproxy_cache_lockproxy_cache_methodsproxy_cache_bypassproxy_no_cacheproxy_cache_min_usesadd_header 可选项 使用示例通过响应头判断是否走缓存 缓存手动删除原博客 前言 客户端需要访问…

Linux系统——nginx服务介绍

一、Nginx——高性能的Web服务端 Nginx的高并发性能优于httpd服务 1.nginx概述 Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间是2004年10月4日&#xff0c;版本…