• 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 {
    
        @Override
        public 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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    1.2 注册自定义EnvironmentPostProcessor处理器

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

    org.springframework.boot.env.EnvironmentPostProcessor=\
      com.learn.env.MyEnv
    
    • 1
    • 2
    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"));
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    测试结果:

    ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](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> {
    
        @Override
        public 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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    1.2 注册自定义ApplicationListener事件监听

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

    org.springframework.context.ApplicationListener=\
      com.learn.event.MyEventListener
    
    • 1
    • 2
    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"));
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    测试结果:

    ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](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参数,进行解密,这样获取的时候就是解密以后的参数了。

  • 相关阅读:
    2022年12月 电子学会青少年软件编程 中小学生Python编程 等级考试一级真题答案解析(选择题)
    安卓Unity3D Camera图像和音频采集推送代码
    月薪12.8K,转行测试从0到1斩获3份过万offer,分享一些我的小秘招~
    可视化 & Echarts
    自定义映射resultMap
    39、jenkins持续集成(二)
    网络爬虫的实战项目:使用JavaScript和Axios爬取Reddit视频并进行数据分析
    java编程基础总结——16.Object类
    8.Covector Transformation Rules
    《Python魔法大冒险》005 魔法挑战:自我介绍机器人
  • 原文地址:https://blog.csdn.net/C_AJing/article/details/136198797