SpringBoot启动自动解密加密配置项

如何在springboot启动过程中自动解密配置文件中的加密部分

废话不多说直接上代码

首先我们需要搭建一个简单的springboot项目

启动类

package com.luojie;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Applications {

    public static void main(String[] args) {
        SpringApplication.run(Applications.class, args);
    }
}

一个简单的controller

package com.luojie.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Value("${test.a.value}")
    private String a;

    @Value("${test.b.value}")
    private String b;

    @Value("${test.c.value}")
    private String c;

    @GetMapping("/test/geta")
    public void test1() {
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }

}

配置文件

test.a.value={decrypt}MTIzNDU2Nzg=
test.b.value={decrypt}YWJjZGVmZw==
test.c.value=123

pre.fix={decrypt}

然后就是我们的解密工具类

package com.luojie.postprocessor;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.env.OriginTrackedMapPropertySource;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;

import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {

    // 可只对需要解密的配置进行解密
    private String pre;

    /**
     * 对全部配置文件进行加解密
     *
     * @param environment
     * @param application
     */
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Map<String, Object> decryptedProperties = new HashMap<>();
        pre = environment.getProperty("pre.fix");
        environment.getPropertySources().forEach(propertySource -> {
            if (propertySource instanceof OriginTrackedMapPropertySource) {
                OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource) propertySource;
                source.getSource().forEach((key, value) -> {
                    String strV = String.valueOf(value);
                    if ((strV.startsWith(pre) && strV.length() > pre.length())) {
                        String decryptedValue = decrypt(strV);
                        decryptedProperties.put(key, decryptedValue);
                    } else {
                        decryptedProperties.put(key, value);
                    }
                });
                // 去掉原来的property
                environment.getPropertySources().remove(propertySource.getName());
                // 增加为新的property
                environment.getPropertySources().addLast(new OriginTrackedMapPropertySource(propertySource.getName(), decryptedProperties));
            }
        });
    }


    private String decrypt(String encryptedValue) {
        // 还原本来应该的属性值
        encryptedValue = encryptedValue.substring(pre.length());
        // 在这里编写你的解密逻辑,这里假设是简单的Base64解码
        return new String(Base64.getDecoder().decode(encryptedValue));
    }
}

同时需要在META-INF文件夹下创建spring.factories

org.springframework.boot.env.EnvironmentPostProcessor=com.luojie.postprocessor.DecryptEnvironmentPostProcessor

EnvironmentPostProcessor接口是Spring Boot提供的一个用于在Spring应用程序启动过程中对Environment进行后处理的扩展点。它允许你在Spring Boot应用程序启动时修改或增强Environment的属性。

Environment代表了Spring应用程序的环境,包括了所有配置属性,如配置文件、系统属性等。EnvironmentPostProcessor接口允许你在Environment加载完成后,但在ApplicationContext创建之前,对环境属性进行修改。

通常,我们可以使用EnvironmentPostProcessor来做一些特定的环境配置,例如:

  • 从外部配置中心加载配置属性。
  • 对配置属性进行加密或解密。
  • 动态地添加或修改配置属性。

然后我们来看看效果,访问controller试试。已经完成解密

ok,已经成功,希望对各位大佬有帮助。麻烦加个关注点个赞谢谢。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot中,可以使用RequestBodyAdvice和ResponseBodyAdvice来实现接口的加密解密逻辑。这两个接口可以在方法中使用@RequestBody和@ResponseBody注解时生效。具体的实现步骤如下: 1. 创建一个自动配置类,比如AppConfig,用于配置加密解密的相关参数。在该类中,可以使用@Bean注解创建一个AES对象,用于进行加密解密操作。可以参考\[3\]中的示例代码。 2. 在自动配置类中,可以使用@Configuration注解标记该类为配置类,并使用@Resource注解注入CryptConfig对象,该对象用于获取加密解密的相关配置参数。 3. 在加密解密的逻辑中,可以使用AES对象进行加密解密操作。可以根据具体的需求选择合适的加密模式、填充方式、密钥和向量等参数。 4. 在接口方法中,使用@RequestBody注解标记需要加密的请求数据,在方法中进行解密操作。然后处理相应的业务逻辑,并使用@ResponseBody注解标记需要加密的返回数据,在返回之前进行加密操作。 通过以上步骤,可以将加密解密的逻辑提取出来,使接口方法只关注业务逻辑的处理。具体的实现可以参考\[2\]中的目结构示例代码。 总结起来,使用Spring Boot的RequestBodyAdvice和ResponseBodyAdvice可以很方便地实现接口的加密解密逻辑,提高代码的可维护性和安全性。 #### 引用[.reference_title] - *1* [springboot中如何优雅的对接口数据进行加密解密](https://blog.csdn.net/xinghui_liu/article/details/121208804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SpringBoot 接口加密解密,新姿势!](https://blog.csdn.net/qq_42914528/article/details/128168527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值