SpringCloud敏感信息配置揭秘,教你防止信息泄露!

开发 前端
敏感信息加密的目的是保护数据的安全性和完整性,防止未经授权的访问和泄露。通过加密敏感信息,可以确保只有经过授权的用户或系统可以解密和访问这些信息。即使配置文件被泄露,攻击者也无法轻易地获取敏感信息的真实内容,从而降低了安全风险。

环境:SpringBoot2.7.12 + SpringCloud2021.0.7 + JDK17

1. 简介

在Spring Boot中,配置文件通常包含了应用程序的敏感信息,例如数据库密码、API密钥、加密密钥等。如果这些敏感信息未经过加密处理,一旦配置文件被泄露或被不当访问,可能会导致安全风险和潜在的恶意行为。因此,对Spring Boot配置文件中的敏感信息进行加密处理是非常必要的。

敏感信息加密的目的是保护数据的安全性和完整性,防止未经授权的访问和泄露。通过加密敏感信息,可以确保只有经过授权的用户或系统可以解密和访问这些信息。即使配置文件被泄露,攻击者也无法轻易地获取敏感信息的真实内容,从而降低了安全风险。

目前在项目中用的比较多的应该是Jasypt,Jasypt是一个Java加密工具包,它简化了对密码的哈希加密、对文本和二进制数据的对称加解密等任务。在Spring Boot中,Jasypt可以用来对配置文件中的密钥进行加密存储,它支持基于标准的高安全性加密技术,适用于单向和双向加密。

本篇我们不会去介绍Jasypt如何使用。如果你的项目中已经使用到了SpringCloud那么SpringCloud已经为我们提供了配置文件内容加解密的处理方法;即时你的项目中没有用到,我们也只需要引入核心包即可使用它的这块功能。接下来将以实例一步一步的交你如何使用。

2. 加解密配置

  • 引入依赖
<properties>
  <java.version>17</java.version>
  <spring-cloud.version>2021.0.7</spring-cloud.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-context</artifactId>
    <version>${spring-cloud.version}</version>
  </dependency>
</dependencies>
  • 配置密钥信息
spring:
  cloud:
    bootstrap:
      enabled: false # 这里必须是false,默认是false。
---
#加密配置
encrypt:
  #密钥
  key: aaaabbbbccccdddd
  #加密处理时的加盐信息
  salt: dead
  • 加密敏感信息
// 通过如下方式将我们需要加密的内容进行加密,如:123123!@ 。进行加密处理
TextEncryptor textEncryptor = new EncryptorFactory("dead").create("aaaabbbbccccdddd") ;
System.out.println(textEncryptor.encrypt("123123!@")) ;
  • 配置文件中配置加密内容
db:
  password: '{cipher}6c05a3e62aa1f71b814fd283fc15197ec18a83b67d9da27dcb63c1b3925d68c1'

注意:这里的前缀必须是:{cipher}

通过以上的配置,我们的配置也是完全可以正常工作的,测试如下:

public class SpringCloudComprehensiveApplication implements ApplicationRunner{
  @Value("${db.password}")
  private String pwd ;


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


  @Override
  public void run(ApplicationArguments args) throws Exception {
    System.out.println(pwd) ;
  }


}

输出结果:

123123!@

正确的输出了结果。

到此配置文件敏感信息加密就完成了。但是发现我们非常重要的密钥信息还是存在配置文件中,这样还是和没加密一样啊,还是暴露了。我们可以通过命令行的方式来设置密钥信息。

  1. 从配置文件中删除配置的encrypt.key和encrypt.salt两个配置。
  2. 启动项目时指定命令行参数,如下:
java -jar xxx.jar --encrypt.key=aaaabbbbccccdddd --encrypt.salt=dead

通过这样设置,我们的程序也将正常的运行。其实命令行参数在程序运行过程中会自动的将这些信息添加到Environment中。

3. 实现原理

spring cloud context中提供了下面一个配置类,该配置类配置了一个ApplicationInitializer应用程序初始化类,也就是ApplicationContext容器初始化前执行的(Environment准备完之后)。

注意:这里是当我们项目中使用了配置中心,如使用了nacos的配置中心时

public class EncryptionBootstrapConfiguration {
  @Bean
  public EnvironmentDecryptApplicationInitializer environmentDecryptApplicationListener(
      ConfigurableApplicationContext context, KeyProperties keyProperties) {
    TextEncryptor encryptor;
    try {
      // 我们完全可以自定义一个TextEncryptor类型的Bean,自己来实现加解密逻辑
      encryptor = context.getBean(TextEncryptor.class);
    }
    EnvironmentDecryptApplicationInitializer listener = new EnvironmentDecryptApplicationInitializer(encryptor);
    return listener;
  }
}

EnvironmentDecryptApplicationInitializer 类会解密我们的配置信息

public class EnvironmentDecryptApplicationInitializer {
  private TextEncryptor encryptor;


  public EnvironmentDecryptApplicationInitializer(TextEncryptor encryptor) {
    this.encryptor = encryptor;
  }
  public void initialize(ConfigurableApplicationContext applicationContext) { 
    MutablePropertySources propertySources = environment.getPropertySources();
    // ...
    // 解密配置文件
    Map<String, Object> map = decrypt(this.encryptor, propertySources);
  }
}

当我们项目中没有启用配置中心时,使用的是另外一个EnvironmentPostProcessor。

public class DecryptEnvironmentPostProcessor extends AbstractEnvironmentDecrypt
    implements EnvironmentPostProcessor, Ordered {
  public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
    // 如果启用了,则该处理器不会生效。
    if (bootstrapEnabled(environment) || useLegacyProcessing(environment) || !isEnabled(environment)) {
      return;
    }
    MutablePropertySources propertySources = environment.getPropertySources();
    // 解密配置文件
    Map<String, Object> map = TextEncryptorUtils.decrypt(this, environment, propertySources);
  }
}

了解了上面的源码实现,其实我们自己也可以借鉴它的实现方式来实现自己的配置文件处理。

注:配置文件的加解密也是支持RSA这种非对称算法的,有兴趣可以了解下,也是非常的简单。

完毕!!!

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2012-02-22 15:10:35

2021-05-07 06:05:28

Docker信息泄露云安全

2022-02-17 11:52:05

​Argo CD漏洞Kubernetes

2023-05-30 20:19:20

2017-09-25 15:14:51

2014-06-30 13:51:27

2017-09-04 15:37:19

2023-12-06 15:36:24

2023-07-12 16:20:06

2020-03-01 22:07:38

信息泄露数据安全

2023-05-17 19:39:58

2021-10-08 11:51:18

Twitchimageboard数据泄露

2021-07-29 15:53:53

信息泄露漏洞网络攻击

2019-04-08 08:00:46

数据泄露数据资产梳理数据安全

2021-11-09 10:10:50

个人信息安全法律

2015-03-16 14:25:13

2013-07-04 09:40:14

2018-11-04 11:33:37

Safari信息泄露漏洞

2011-03-02 16:04:16

2023-04-14 18:04:56

点赞
收藏

51CTO技术栈公众号