前言
在开发过程中,我们数据库的连接信息是很敏感的,直接以明文的方式写在配置文件中,存在很大的风险,数据库用户名及密码很容易泄露,所以推荐以密文的方式书写配置文件中的敏感信息。jasypt 是一个 java 实现的安全框架,国外大神 Ulises Bocchio 写了一个spring boot 下用的工具包,github 地址https://github.com/ulisesbocchio/jasypt-spring-boot,该工具包支持使用jasypt框架来处理properties和yml配置文件参数内容的加解密操作,该工具已经发布到了中央仓库供大家使用。
使用步骤
- maven 依赖引入
jdk1.8 及以上
<!-- 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.2</version>
</dependency>
jdk1.7
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.5-java7</version>
</dependency>
jdk1.6
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>1.5-java6</version>
</dependency>
- 使用jasypt-1.9.3.jar 工具包对明文进行加密,在jasypt-1.9.3.jar 所在位置打开cmd,执行命令:
- java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=明文 password=ljm algorithm=PBEWithMD5AndDES
PS: jar包的位置在你的maven仓库中的org\jasypt\jasypt\1.9.3目录里
➢ Input:待加密的明文
➢ password:秘钥(可自定义)
➢ algorithm:加密算法
➢ OUTPUT:加密后的密文
默认情况下jasypt采用的算法是PBEWithMD5AndDES,该算法对同一串明文每次
加密的密文都不一样,比较适合做数据加解密。但是该算法必须配置秘钥,我们在yml文件配置如下参数
我们将需要加密的值配置为ENC(rmmk4ElS/DX0V+nS6TbF9w==),为什么需要这么配置呢,因为默认情况下jasypt-spring-boot 解析密码的规则是前缀是"ENC(",后缀是")"
这样就加密完成了,启动项目时,jasypt会自动拦截被ENC()标记的密文,自动解密为明文,但是将秘钥直接放到配置文件,还是存在风险的,当攻击者获取你的秘钥后,可以根据算法解密,这就达不到我们预期的目的了,所以,还需要改造!
- 改造
➢ 我们可以把秘钥放到服务器的环境变量里,让yml文件通过读取服务器环境变量的方式获取秘钥,如图添加环境变量(以windows系统为例):
添加环境变量后,windows 需要重启,因为 springboot 读取机器环境变量是从缓存读取的,必须重启电脑刷新变量缓存。
➢ 修改yml文件
这样改造就完成了,既对连接信息进行了加密,又让攻击者不能从配置文件获取到秘钥,敏感信息的安全性大大提高! - 除了把密钥添加到环境变量的方法,还有一种方法,那就是启动springboot项目时,启动命令指定密钥
java -jar xxx.jar --jasypt.encryptor.password=ljm