Springboot 自定义配置文件加密规则

简介: 一般情况下,我们做项目的时候,中间件例如mysql,redis, zk 的账号密码一般都是写在配置文件里面的, 这样代码泄露的情况下, 就很不安全。

一般情况下,我们做项目的时候,中间件例如mysql,redis, zk 的账号密码一般都是写在配置文件里面的, 这样代码泄露的情况下, 就很不安全。

由第三方的加密的工具 jasypt 这种jar包。 这里我们仿写它来实现自己的配置文件加密规则。

jasypt 连接:https://github.com/ulisesbocchio/jasypt-spring-boot

具体的使用大家看我发的地址。

这里我们要用到ConfigurableEnviroment 这个类,我们来看一下源码

public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {

void setActiveProfiles(String... var1);

void addActiveProfile(String var1);

void setDefaultProfiles(String... var1);

// resource 文件多个,这个可以是classpath ,file ,default 的

MutablePropertySources getPropertySources();

// 获取系统配置文件

Map<String, Object> getSystemProperties();

// 获取系统环境变量

Map<String, Object> getSystemEnvironment();

void merge(ConfigurableEnvironment var1);

}

首先我们要自己写一个类实现BeanFactoryPostProcessor ,和order 接口

public class PropertiesEncryptionConfig implements BeanFactoryPostProcessor, Ordered {

// 前缀的key 
public static final String PREFIX_PROPERTY = "xxxxx.encrypt.prefix";
// 后缀的key 
public static final String SUFFIX_PROPERTY = "xxxxx.encrypt.suffix";

// 私钥的key 
public static final String RSA_PRIVATE_KEY_PROPERTY = "xxxxx.encrypt.privateKey";

// 前缀默认值
public static final String DEFAULT_PREFIX = "xxxxx[";

 //后缀默认值
public static final String DEFAULT_SUFFIX = "]";


private static final Logger LOG = LoggerFactory.getLogger(PropertiesEncryptionConfig.class);

// 在通过@bean 注入进来
public   ConfigurableEnvironment  environment ;

public PropertiesEncryptionConfig(ConfigurableEnvironment environment) {
    this.environment = environment;
}

private String prefix;

private String suffix;

private String privateKey;


@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    MutablePropertySources propertySources = environment.getPropertySources();
    for (PropertySource<?> propertySource : propertySources) {
        if (propertySource instanceof OriginTrackedMapPropertySource) {
            // 只有这个才是加载properties 文件的,getsource 返回的就是map
            OriginTrackedMapPropertySource om = (OriginTrackedMapPropertySource) propertySource;
            Map<String, Object> source = om.getSource();
            source.forEach((k, v) -> {
                String property = environment.getProperty(k);
                if (hasPreAndSuf(property)) {
                    LOG.info("开始处理 k = [{}]", k);
                    try {
                        String relay = splitPreAndSuf(property, this.prefix, this.suffix);
                        // 这里获取去掉前缀后缀的值 在通过自己的解密规则 ,
                        //这里 AesUtils 可以搞成注入模式, 这样使用的时候可以进行加密。自己写aes 的加密工具类 
                        String decrypt = AesUtils.aesDecrypt(relay, getPrivateKey(environment));
                        source.put(k, decrypt);
                    }
                    catch (Exception e) {
                        LOG.error("配置文件加密异常错误信息: ", e);
                    }
                }
            });
        }
    }
}

private String getPrivateKey(ConfigurableEnvironment environment) throws Exception {
    // 支持从系统环境变量 java -jar 运行的时候获取
    this.privateKey = System.getProperty(RSA_PRIVATE_KEY_PROPERTY, "");
    if (StringUtils.hasText(this.privateKey)) {
        return this.privateKey;
    }
    // 支持从文件获取
    this.privateKey = environment.getProperty(RSA_PRIVATE_KEY_PROPERTY);
    if (StringUtils.hasText(this.privateKey)) {
        return this.privateKey;
    }
    // 都没有就会报错
    throw new Exception(" properties aes  private key is null!");
}

// 判断一下,前缀后缀是否匹配
private boolean hasPreAndSuf(String property) {
    return property.startsWith(getPrefix(environment)) && property.endsWith(getSuffix(environment));
}

// 去掉前缀后缀获取中间值
protected String splitPreAndSuf(String str, String prefix, String suffix) {
    return str.replace(prefix, "").replace(suffix, "");
}

// 获取后缀,没有使用默认值
private String getSuffix(ConfigurableEnvironment environment) {
    this.suffix = environment.getProperty(SUFFIX_PROPERTY);
    if (StringUtils.hasLength(suffix)) {
        return this.suffix;
    }
    this.suffix = DEFAULT_SUFFIX;
    return DEFAULT_SUFFIX;
}

// 获取前缀,使用默认值

private String getPrefix(ConfigurableEnvironment environment) {
    this.prefix = environment.getProperty(PREFIX_PROPERTY);
    if (StringUtils.hasLength(prefix)) {
        return this.prefix;
    }
    this.prefix = DEFAULT_PREFIX;
    return DEFAULT_PREFIX;
}

/**
 *  提高优先级
 * @return
 */
@Override
public int getOrder() {
    return Ordered.LOWEST_PRECEDENCE -100;
}

}

@Configuration
public class EnablePropertiesEncryption {

@Bean
public PropertiesEncryptionConfig getPropertiesEncryption(ConfigurableEnvironment configurableEnvironment){
    return  new PropertiesEncryptionConfig(configurableEnvironment);
}

// 加密解密工具类 ,可以在spring单元测试使用@Autowired注入
@Bean
public AesUtils getAes(){
    return  new AesUtils();
}

}

这样我们就基本实现了jasypt 的功能。

相关文章
|
3月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
980 10
|
5月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
377 3
Jasypt加密数据库配置信息
|
4月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1126 1
|
8月前
|
编解码 安全 Java
如何在Spring Boot中实现数据加密
本文介绍了如何在Spring Boot中实现数据加密。首先阐述了数据加密的重要性与应用场景,接着讲解了对称加密和非对称加密的原理及区别。通过添加依赖、配置加密算法、编写加密工具类等步骤,展示了具体实现方法,并在业务代码中应用加密技术保护敏感数据。希望对开发者有所帮助。
664 7
|
存储 安全 数据安全/隐私保护
Docker中配置TLS加密的步骤
我们可以在 Docker 中成功配置 TLS 加密,增强 Docker 环境的安全性,保护容器之间以及与外界的通信安全。需要注意的是,在实际应用中,应根据具体情况进行更细致的配置和调整,确保符合安全要求。同时,定期更新证书和私钥,以保障安全性。
797 60
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
677 60
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
696 60
|
存储 算法 安全
SpringBoot 接口加密解密实现
【10月更文挑战第18天】
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
310 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
下一篇
oss云网关配置