Skip to content
本页目录

Spring Cloud 敏感配置信息加密处理

Spring Cloud 微服务中,通常很多信息都是在 application.ymlNacos Server 中直接明文配置,比如数据库、redis连接信息等。其中也会涉及密码等敏感信息,直接明文方式配置是很不安全的。

所以需要对敏感信息进行加密,防止密码泄漏。 Jasypt 这个库就是为了解决这个问题,实现了 Spring Cloud 配置的自动加密解密。

源码地址:https://gitee.com/mirrors/jasypt-spring-boot

启用配置加解密

添加 jasypt-spring-boot-starter 依赖

在项目 pom.xml 文件中添加如下依赖:

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

配置 jasypt 信息

Spring 配置文件中配置 Jasypt 相关信息,如下:

yml
jasypt:
  encryptor:
    # 加密算法
    algorithm: PBEWITHHMACSHA512ANDAES_256
    # 加密使用的盐,生产环境时,使用启动参数传递密钥,避免密钥与密码同时在配置文件中泄漏
    password: jaspyt_password

加解密测试

java
@SpringBootTest
@RunWith(SpringRunner.class)
public class JasyptTest {
 
  @Autowired
  private StringEncryptor stringEncryptor;

  /**
   * 加密解密测试
   */
  @Test
  public void jasyptTest() {
      // 加密
      System.out.println(stringEncryptor.encrypt("root"));    
      // JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg
      // 解密
      System.out.println(stringEncryptor.decrypt("JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg"));    
      // root
  }

  /**
   * 手动测试
   */
  @Test
  public void test() {
      PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
      SimpleStringPBEConfig config = new SimpleStringPBEConfig();
      config.setPassword("jaspyt_password");
      config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
      config.setKeyObtentionIterations("1000");
      config.setPoolSize("1");
      config.setProviderName("SunJCE");
      config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
      config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
      config.setStringOutputType("base64");
      encryptor.setConfig(config);
      System.out.println(encryptor.encrypt("root"));    
      // JSrINYe4IBotHndGjX1hnmY3mtPNUJlXjP12cx1+pHqUz2FNXGPu3Frnajh3QCXg
  }
}

Spring 配置中使用加密属性

通过 application.ymlNacos Server 的配置中,可以使用 ENC()包裹加密后的字符串代替密码等原始参数值使用,如下:

yaml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.10.31/mp
    username: root
    # 使用ENC()包裹,标识为加密之后的,否则无法解密,会报错
    password: ENC(R2H69h1aEgJ3EDPLXAVQ5CxZJWtl8EvqIJUtlATRt6om4w46/J+blu2JAvkR7Yvp)

生成环境启动

生产环境密钥作为启动参数:

shell
java -jar -Djasypt.encryptor.password=your-secret

变量使用时,和普通参数值相同,无需做特殊处理

内部资料,请勿外传