说明:
- 使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性比较低。
- 打开application.properties或application.yml,比如MySQL登录密码,Redis登录密码以及第三方的密钥等等一览无余。
- 这里介绍一个加解密组件jasypt,用以提高配置文件中敏感配置数据的安全性。
- 本文以数据库连接URL、用户名和数据库密码加密为例。
一,引入Maven依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
说明:
1)这里使用的是2.1.0版本的jasypt-spring-boot-starter。
2)目前jasypt-spring-boot-starter的最新版本是3.0.5。版本不同,配置可能也不一样,请以官网为准。本文的配置,仅供2.1.0版本参考。
二,application.yml配置文件中增加如下内容(加解密时使用)
#jasypt加密的密钥
jasypt:
encryptor:
property:
prefix: "enc@["
suffix: "]"
#生产环境中,jasypt.encryptor.password不能与密文放在一起
#可以通过系统属性、命令行参数或环境变量传递
password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7
说明:
- 上面的password必须自己定义,其他都可以不配置,因为有默认配置。
- 在生产环境中,
jasypt.encryptor.password
不能与密文放在一起,我们可以在项目当中通过系统属性、命令行参数或环境变量传递。- jasypt默认使用ENC(),()里面是加密后的信息。这里我配置成enc@[],即,[]里面是加密后的配置数据。可以不配置。
Key | Required | Default Value |
---|---|---|
jasypt.encryptor.password | True | - |
jasypt.encryptor.algorithm | False | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | False | 1000 |
jasypt.encryptor.pool-size | False | 1 |
jasypt.encryptor.provider-name | False | SunJCE |
jasypt.encryptor.provider-class-name | False | null |
jasypt.encryptor.salt-generator-classname | False | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generator-classname | False | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | False | base64 |
jasypt.encryptor.proxy-property-sources | False | false |
jasypt.encryptor.skip-property-sources | False | empty list |
三,创建测试类,用以生成加密后的秘钥
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
public class JasyptTest {
public static void main(String args[]) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
//设置加密密码,请和配置文件中的保持一致,默认会添加随机盐
config.setPassword("EbfYkitulv73I2p0mXI50JMXoaxZTKJ7");
//设置pool size
config.setPoolSize(1);
encryptor.setConfig(config);
String url = encryptor.encrypt("jdbc:mysql://192.168.111.88:3306/testdb?allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true");
String name = encryptor.encrypt("你的数据库账号");
String password = encryptor.encrypt("你的数据库密码");
System.out.println("数据库连接URL----------------" + url);
System.out.println("数据库账号----------------"+ name);
System.out.println("数据库密码----------------" + password);
}
}
下面是加密后的输出结果
数据库连接URL----------------GxNAlIqGJiGaufrvrxtCS2udohjUDRyGTCNv1iuK+I2zTNK1OjVEAn0kK3tjjoIS9LPTJMiXJNuPma1fFtA6Kydaq0/qfAOOOnZS9dVNiiOneXYCy0CXwFW21HeuqQMSXicz6K6mTUjTSXoLt3BedTeuMBAjIrMvzPyBAxXpKaTGIHWJayu2o+T1IRbkMWOP4c+ruUB57E2SXSrgcvI2n4yq2jK84/Y3VV3HlwnuEdxNlc54P9v+u8cP5F7EmgcZzqONAEGd1o4=
数据库账号----------------7JpTbrd7hOStIks6Nih3vA==
数据库密码----------------kCNP4+yhce5nF+3c+tR3ww==
四,将上面生成的url、name和password替换配置文件中的数据库连接url、数据库账户和密码
spring:
#数据库相关配置
datasource:
url: enc@[YjiBkdvORJnXqy1ZAWXWKtA7YMRI8GAibT9hUyqyrwo9r4K0CnIrOncYpE3Lu9J71VTDsBrJS7fXc5vHM4pkiWr3hY7UNByIIO1rxtybAsd6iw1rQpOxkOGl/9j1qbIHoK8aNg8FR/7tXcHAIi67DE1FF0XkBpwP/TnMKlHCHGwNVcy1W2T/l7u0gs3sFXRZHp9p4yLYiK0Y6MJ++ouMHxkoEOoWyZJMBok8emZQEZAaUZlrWeBrPZQrUZApjYOYWjiAnxo0Zx8=]
username: enc@[aDnOObes8lHTwQhxKm+lPA==]
password: enc@[HgklvFzp5ukvdaU9C/tyZqTlO4RrJxor]
#jasypt加密的密钥
jasypt:
encryptor:
property:
prefix: "enc@["
suffix: "]"
password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7
到此,我们就实现了Springboot配置文件里的敏感信息加密。
五、参考链接
- jasypt插件的开源地址:https://github.com/ulisesbocchio/jasypt-spring-boot
- SpringBoot配置文件敏感信息加密,springboot配置文件数据库密码加密jasypt