Content Table

Spring Boot Jasypt

使用 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
2
spring.datasource.password: ENC(JgJYQKNWTCLs7QEJ0jDneX6wfHhM0uccO/DFJ32f8E/Oqa32+eoxR0voKAnS8cmI)
jasypt.encryptor.password: xtuer

把 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
2
spring.datasource.password: ENC(OBB3r/UN9BuxfP/23tWKMg==)
jasypt.encryptor.password: xtuer

可以看到, 3.0 的密码强度比 2.0 的强了不少。

3.0 兼容 2.0 生成的密文

使用 jasypt-spring-boot-starter 3.0 依赖,为了使用 2.0 生成的密文,需要在配置文件中如下设置才可以:

1
2
3
4
5
spring.datasource.password: ENC(OBB3r/UN9BuxfP/23tWKMg==)

jasypt.encryptor.password: xtuer
jasypt.encryptor.iv-generator-classname: org.jasypt.iv.NoIvGenerator
jasypt.encryptor.algorithm: PBEWithMD5AndDES

参考 Update 11/24/2019: Version 3.0.0 Release Includes 的说明。

官方加密解密

上面加密命令直接运行 jasypt-1.9.3.jar 中的类,官方文档 EncryptionDecryption 介绍了使用 Maven 插件和命令进行加密解密:

  1. 在任意一个 Maven 项目中引入插件: Jasypt Maven Plugin
  2. 在项目根目录执行
    • 加密: 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 的解析不同造成命令运行出错。