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

二、解决
-
通过配置中心
动态加载配置文件
-
通过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:}
这样就安全多了