springboot整合jasypt加密yml配置文件

一、前言

通常项目配置文件中的账号信息如下,都是直接暴露出来的,如果源码不小心泄露将会引起一系列安全问题

二、解决

  1. 通过配置中心动态加载配置文件
  2. 通过jasypt加密组件进行加密/解密

三、实现

1、pom.xml中引入依赖

<!-- jasypt加密组件: https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency>

2、application.yml中配置加密密钥

# 配置加密密钥 jasypt: encryptor: password: zhong # 这里密钥修改 随意

3、jasypt加密/解密测试类

public class JasyptTest { @Test public void test() { // 对应配置文件中配置的加密密钥 System.setProperty("jasypt.encryptor.password", "zhong"); StringEncryptor stringEncryptor = new DefaultLazyEncryptor(new StandardEnvironment()); System.out.println("加密: " + stringEncryptor.encrypt("root")); System.out.println("解密: " + stringEncryptor.decrypt("上面加密的字符串")); } }

4、修改yml配置文件账号信息为加密方式

spring:
    application:
        name: scheduled
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        name: defaultDataSource
        password: ENC(uBxFfL0wQd9sL9CLV1zZbg==)
        url: jdbc:mysql://127.0.0.1:3306/aj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: ENC(BkmP68GGfNiTdQfZRXwoqA==)
jasypt:
    encryptor:
        password: zhong

四、扩展知识

自定义加密标识

jasypt默认使用ENC()来标识加密,加载配置的时候检测到ENC()即会自动解密 下面我们来尝试自定义一个加密标识,JAVA_ABE()

application.yml中新增如下配置:

jasypt: encryptor: property: prefix: JAVA_ABE( # 加密前缀 suffix: ) # 加密后缀 password: zhong # 加密密钥

修改配置如下:

spring:
    application:
        name: scheduled
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        name: defaultDataSource
        password: JAVA_ABE(uBxFfL0wQd9sL9CLV1zZbg==)
        url: jdbc:mysql://127.0.0.1:3306/aj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: JAVA_ABE(BkmP68GGfNiTdQfZRXwoqA==)
jasypt:
    encryptor:
        password: zhong

让加密更安全

虽然经过上文的加密,涉及信息安全的配置项肯定会变得更安全,这个是毫无疑问的!

但是假如配置文件里的自定义加密密钥jasypt.encryptor.password=zhong泄露了,那我们的加密字段也还是有可能被别人解密(毕竟还是写在了配置文件中),为此,有几项工作可以让加密变得更加安全。

方式一:直接作为程序启动时的命令行参数来带入

java -jar scheduled.jar --jasypt.encryptor.password=zhong

方式二:直接作为程序启动时的应用环境变量来带入

java -Djasypt.encryptor.password=zhong -jar scheduled.jar

方式三:甚至可以作为系统环境变量的方式来带入

jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}

这样就安全多了

PS:加密密钥不要写在配置文件中 安全起见!

经验分享 程序员 微信小程序 职场和发展