SpringBoot配置文件中敏感信息加密的三种方法

 更新时间:2024年05月19日 14:38:53   作者:大骨熬汤  
当我们将项目部署到服务器上时,一般会在jar包的同级目录下加上application.yml配置文件,这样可以在不重新换包的情况下修改配置,这种方式存在安全隐患,如果配置文件泄露,就会造成数据库密码泄露,所以本文给大家介绍了SpringBoot配置文件中敏感信息加密的三种方法

一. 背景

当我们将项目部署到服务器上时,一般会在jar包的同级目录下加上application.yml配置文件,这样可以在不重新换包的情况下修改配置。

一般会将数据库连接、Redis连接等放到配置文件中。

例如配置数据库连接:

spring:
  servlet:
    multipart:
      max-file-size: 10MB # 文件大小限制
      max-request-size: 100MB # 请求大小限制
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456

这种方式存在安全隐患,如果配置文件泄露,就会造成数据库密码泄露。

所以需要将配置文件中数据库密码等敏感数据加密,然后在使用的时候解密后再使用。
推荐使用第三种方式。

二. 方法介绍

本文介绍三种方式。

1. 解密方法嵌入到业务逻辑代码中

例如我可以在service或者正常的业务代码中去加密后再使用。

但是这种和业务耦合度高,不推荐。

2. 使用jasypt

2.1 第一步:pom引入依赖

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>

2.2 第二步:application.yml中增加jasypt配置

配置文件里配置该算法加解密的盐值。jaspypt算法不需要我们自己实现,该第三方库已经实现了。我们仅需要配置这个盐值即可。

# 如果密文加盐,需要配置盐值
jasypt:
  encryptor:
    password: ueiej@8e8r

2.3 第三步:application.yml中密文替代明文。

配置文件里将加密后得到的密文用ENC(密文)方式配置即可。项目启动的时候,程序会自动去解析配置文件中值为ENC(密文)格式的配置,然后解密后加载程序。

数据的加密可以自己实现工具类来加密,或者一些在线网站提供jasypt的加解密,得到加密后的密文后,将密文替换明文即可。

例如:

password: ENC(UBHpSHxjL2F8ZiNTJUciZw==)

到此就全部结束了。项目启动的时候程序会自动去解密,并注入到实际的springApplication中。

优缺点

优点:是引入第三方库,简单匹配一下即可,业务代码不需要任何改动。

缺点:是把jasypt的盐放到配置文件中,那实际上你的加密数据也跟裸奔一样了,别人一样可以用这个jasypt解密得到你的数据库密码等加密数据。

3. 使用自定义加解密算法并自动装配

3.1 第一步:确定加解密规则,编写工具类

我们可以自定义加解密算法来实现数据的加解密,这里采用AES算法。工具类的代码省略。

3.2 第二步:实现EnvironmentPostProcessor

Spring Boot没有为加密属性值提供任何内置支持。 EnvironmentPostProcessor 接口允许你在应用程序启动前操作 Environment,可以用来修改Spring Environment 中包含的值。实现接口,并在接口里遍历所有的配置项,将指定的配置项解密后重新写入Environment。

示例:

public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Properties props = new Properties();  // 临时存储需要替换的配置
        // 假设加密密码前缀为 "ENC(",后缀为 ")"
        MutablePropertySources propertySources = environment.getPropertySources();
        for (PropertySource<?> propertySource : propertySources) {
            if (propertySource instanceof EnumerablePropertySource) {
                EnumerablePropertySource<?> enumerablePropertySource = (EnumerablePropertySource<?>) propertySource;
                String[] propertyNames = enumerablePropertySource.getPropertyNames();
                // 遍历所有配置key:value
                for (String propertyName : propertyNames) {
                    String propertyVal = environment.getProperty(propertyName);
                    // 根据自己写的规则来解析那些配置是需要解密的
                    if (propertyVal != null && propertyVal.startsWith("ENC(") && propertyVal.endsWith(")")) {
                        // 解析得到加密的数据
                        String encryptedValue = propertyVal.substring(4, propertyVal.length() - 1);
                        // 调用自定义工具类解密
                        String decryptedValue = AESUtil.decryptEcbMode(encryptedValue);
                        // 保存需要替换的配置
                        props.put(propertyName, decryptedValue);
                    }
                }
            }
        }
        // 添加解密后的属性到环境中
        if (!props.isEmpty()) {
            PropertiesPropertySource pps = new PropertiesPropertySource("decryptedProperties", props);
            environment.getPropertySources().addFirst(pps);
        }
    }
}

3.3 自动装配

resources/META-INF/spring.factories中注册EnvironmentPostProcessor

org.springframework.boot.env.EnvironmentPostProcessor=\  
your.package.DecryptEnvironmentPostProcessor

这里把自己实现的.DecryptEnvironmentPostProcesso的全路径放进去即可。

没有META-INF/spring.factories文件的,直接建好目录新增这个文件就行。

3.4 配置文件密文替换明文

使用自定义的工具类将密码加密,得到密文。用密文替换配置中的密文。

这里我依然使用ENC(密文)的格式去配置,这个规则可以自己定义,只要修改DecryptEnvironmentPostProcessor的方法中的匹配逻辑即可。

例如:

spring:  
  datasource:  
    password: ENC(你的加密密码)

注意事项

你可以写死你的加密的配置项,然后在postProcessEnvironme()方法里找到对应的配置项解密。或者你可以将加密的所有数据都用ENC(加密的数据)表示,然后在postProcessEnvironme方法里匹配后解密即可。当然这里的编写规则你可以自己定义,只要能匹配出来即可。

例如我的配置如下:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: ENC(UBHpSHxjL2F8ZiNTJUciZw==)

其中数据库的密码就是AES算法解密后的结果。

总结

建议用第三种方式,因为这种加密算法可以自定义,并且不需要把加解密的秘钥放到配置文件里,即便有人拿到配置文件,也无法得到真实的密码,更加的安全。

而且第三种方式对业务代码没有侵入,也不需要特定引入第三方库和配置其他东西。

以上就是SpringBoot配置文件中敏感信息加密的三种方法的详细内容,更多关于SpringBoot敏感信息加密的资料请关注脚本之家其它相关文章!

相关文章

  • java springboot poi 从controller 接收不同类型excel 文件处理

    java springboot poi 从controller 接收不同类型excel 文件处理

    这篇文章主要介绍了java springboot poi 从controller 接收不同类型excel 文件处理,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 基于JPA的Repository使用详解

    基于JPA的Repository使用详解

    这篇文章主要介绍了JPA的Repository使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • JavaWeb登陆功能实现代码

    JavaWeb登陆功能实现代码

    这篇文章主要为大家详细介绍了JavaWeb登陆功能实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java中将String转换为int的多种方法

    Java中将String转换为int的多种方法

    字符串转换为整数是一个常见需求,本文主要介绍了Java中将String转换为int的多种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • mybatis模糊查询之bind标签和concat函数用法详解

    mybatis模糊查询之bind标签和concat函数用法详解

    大家都知道bind 标签可以使用 OGNL 表达式创建一个变量井将其绑定到上下文中,接下来通过本文给大家介绍了mybatis模糊查询——bind标签和concat函数用法,需要的朋友可以参考下
    2022-08-08
  • Java微服务间接口调用 feign

    Java微服务间接口调用 feign

    这篇文章主要介绍了微服务间的接口调用feign,Feign是一种声明式、模板化的HTTP客户端。在spring cloud中使用Feign,可以做到类似于普通的接口的请求调用,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • java清除u盘内存卡里的垃圾文件示例

    java清除u盘内存卡里的垃圾文件示例

    手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个文件占用了内存太大了
    2014-02-02
  • Java设计模式之外观模式示例详解

    Java设计模式之外观模式示例详解

    外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节。本文将通过示例详细为大家讲解一下外观模式,需要的可以参考一下
    2022-08-08
  • Java实现答答租车系统

    Java实现答答租车系统

    这篇文章主要为大家详细介绍了Java实现答答租车系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • struts2中simple主题下<s:fieldError>标签默认样式的移除方法

    struts2中simple主题下<s:fieldError>标签默认样式的移除方法

    这篇文章主要给大家介绍了关于struts2中simple主题下<s:fieldError>标签默认样式的移除方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-10-10

最新评论