使用jasypt加密Spring Boot应用中的敏感配置

欢迎访问 陈同学博客原文
jasypt-spring-boot on github

本文讲述了在Spring Boot/Spring Cloud应用中使用jasypt来加密properties。

jasypt 简介

详细信息直接看github文档即可,这里仅简单罗列一丢丢信息。

Jasypt为Spring Boot应用提供property sources的加密支持,可以加密的数据有:

  • system property
  • environment property
  • command line argument
  • application.properties
  • yaml properties
  • other custom property sources

哪些是敏感信息?

由于很多应用使用 配置文件 (eg:properties、yml) 来存储配置信息,配置中经常会涉及到许多敏感信息。

举几个小例子:

  • 普通应用密码信息,如:DB、Rabbit、Redis等
  • 特殊密码信息,如:Spring Cloud Config需要配置Git等VCS密码信息
  • 第三方通讯凭证信息,如:调用第三方接口发送短信的通讯凭证信息

由于各业务场景不同,因此敏感信息的定义也不同。

应用场景案例

这里以自有团队的Spring Cloud Config来举个例子。

  • 场景: 使用两个git repository来存储配置信息,一个存储生产环境配置,一个存储非生产环境所有配置。分两个的目的是控制权限,生产环境仅特定人员可见。
  • 问题: 由于VCS的账户密码存储在配置文件中,所以分两个git repo存储配置也是自欺欺人,可以直接根据配置文件中的VCS密码下载生产环境的配置信息。
  • 解决: 对VCS密码进行加密

加密前的数据:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://example.domain.com/helloworld.git
          username: yourname
          password: yourpwd

加密后的数据:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://example.domain.com/helloworld.git
          username: username
          password: ENC(DoyyHAMYaEyJBJHW496HiTT4VIazUYZo)

如何使用jasypt

参考 jasypt github文档最好,里面有更多信息,这里仅抛砖引玉,简单列举下使用步骤。

引入jasypt-spring-boot-starter依赖


    com.github.ulisesbocchio
    jasypt-spring-boot-starter
    2.0.0

配置加/解的密码

以配置在 bootstrap.yml 中为例:

jasypt:
  encryptor:
    password: JH8AS90jasH

默认使用 PBEWithMD5AndDES 加密算法,只有 jasypt.encryptor.password 是必要配置。

加密你的属性

假设需要加密DB密码,密码为123456

创建一个测试类,加密后得到的加密密码为:BsSPrDRNeU/Nb1v/GsHvZA==

@RunWith(SpringRunner.class)
@SpringBootTest
public class BlogApplicationTests {

    @Autowired
    StringEncryptor stringEncryptor;

    @Test
    public void test() {
        System.out.println(stringEncryptor.encrypt("123456"));
    }
}

配置加密后的属性

将加密后的属性值配置在配置文件中即可,ENC 是约定的关键字,在启动时会解析所有 PropertySource 中的加密属性。

spring.datasource.password=ENC(BsSPrDRNeU/Nb1v/GsHvZA==)

小结

jasypt文档有更详细的介绍,支持多种配置方式甚至定制自己的Encryptor。

阅读本文的伙伴知道有这么回事即可,以后有使用场景时也算是个不错的选择。


欢迎关注陈同学的公众号,一起学习,一起成长

你可能感兴趣的:(java)