使用 Jasypt 加密 Spring Boot 配置中的项,例如数据库密码。详细介绍可阅读 Springboot 配置文件、隐私数据脱敏的最佳实践 和 Spring Boot 配置文件密码加密两种方案。
本文主要介绍具体使用部分,注意 jasypt-spring-boot-starter 2.0 和 3.0 的区别。3.0 前后虽然都是使用 jasypt-1.9.3.jar,但是生成密文命令的参数有点区别:
版本 | algorithm 默认值 | iv-generator 默认值 | 加密命令 |
---|---|---|---|
2.1.2 | PBEWithMD5AndDES | org.jasypt.iv.NoIvGenerator | java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=root password=xtuer algorithm=PBEWithMD5AndDES |
3.0.3 | PBEWITHHMACSHA512ANDAES_256 | org.jasypt.iv.RandomIvGenerator | java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=root password=xtuer algorithm=PBEWITHHMACSHA512ANDAES_256 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator |
提示:
- input 为要加密的内容,password 为加密的密钥
- jasypt-1.9.3.jar 可以从 maven 或者 gradle 本地仓库中找到
jasypt-spring-boot-starter:3.0
引入依赖:
1 | implementation "com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3" |
生成密文:
1 | java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=root password=xtuer algorithm=PBEWITHHMACSHA512ANDAES_256 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator |
配置内容:
1 | spring.datasource.password: ENC(JgJYQKNWTCLs7QEJ0jDneX6wfHhM0uccO/DFJ32f8E/Oqa32+eoxR0voKAnS8cmI) |
把 jasypt.encryptor.password 写在配置文件中不够安全,可以从配置文件中把它删除,其值通过命令行参数传入或者配置到环境变量里:
- 命令行参数:
--jasypt.encryptor.password=xtuer
- 环境变量里:
JASYPT_ENCRYPTOR_PASSWORD=xtuer
(Windows 和 Linux 配置方式有区别)
jasypt-spring-boot-starter:2.0
引入依赖:
1 | implementation "com.github.ulisesbocchio:jasypt-spring-boot-starter:2.1.2" |
生成密文:
1 | java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=root password=xtuer algorithm=PBEWithMD5AndDES |
配置内容:
1 | spring.datasource.password: ENC(OBB3r/UN9BuxfP/23tWKMg==) |
可以看到, 3.0 的密码强度比 2.0 的强了不少。
3.0 兼容 2.0 生成的密文
使用 jasypt-spring-boot-starter 3.0 依赖,为了使用 2.0 生成的密文,需要在配置文件中如下设置才可以:
1 | spring.datasource.password: ENC(OBB3r/UN9BuxfP/23tWKMg==) |
参考 Update 11/24/2019: Version 3.0.0 Release Includes 的说明。
官方加密解密
上面加密命令直接运行 jasypt-1.9.3.jar 中的类,官方文档 Encryption 和 Decryption 介绍了使用 Maven 插件和命令进行加密解密:
- 在任意一个 Maven 项目中引入插件: Jasypt Maven Plugin
- 在项目根目录执行
- 加密:
mvn jasypt:encrypt-value -Djasypt.encryptor.password="the password" -Djasypt.plugin.value="theValueYouWantToEncrypt"
- 解密:
mvn jasypt:decrypt-value -Djasypt.encryptor.password="the password" -Djasypt.plugin.value="DbG1GppXOsFa2G69PnmADvQFI3esceEhJYbaEIKCcEO5C85JEqGAhfcjFMGnoRFf"
- 加密:
需要注意的是,在 Windows 中,不能在 PowerShell 里执行这些命令,而是需要在 CMD 里执行,因为 PowerShell 对 -D 的解析不同造成命令运行出错。