在 Spring 开发中,为了保护配置文件中的敏感信息,比如数据库密码、云密钥等数据,需要对配置进行加密,而jasypt-spring-boot
就为我们提供了这样的实现。
在 maven 中我们可以使用mvn jasypt:encrypt-value
或者mvn jasypt:decrypt-value
通过命令行对数据进行加解密,gradle 也有相应的工具:
- https://github.com/ximtech/jasypt-encrypt-plugin
- https://github.com/moberwasserlechner/jasypt-gradle-plugin
但都不是官方维护,有一定的风险,出了问题解决起来比较麻烦。
添加 gradle 命令
经过查询资料,我们可以在 gradle 里面定义相关的命令:
// jasypt加解密任务
abstract class JasyptCliTask extends JavaExec {
@Input
String input
@Input
String password
@Input
Boolean isEncryptionCli
@TaskAction
@Override
void exec() {
def jasyptCliClass = isEncryptionCli ? 'JasyptPBEStringEncryptionCLI' : 'JasyptPBEStringDecryptionCLI'
if (isEncryptionCli) {
println("plain text: \n${input}\n")
println("cipher text:")
} else {
println("cipher text: \n${input}\n")
println("plain text:")
}
project.javaexec {
classpath = project.sourceSets.main.runtimeClasspath
mainClass.set('org.jasypt.intf.cli.' + jasyptCliClass)
args = [
'input="' + input + '"',
'password="' + password + '"',
'algorithm=PBEWITHHMACSHA512ANDAES_256',
'ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator',
'verbose=false'
]
}
}
}
tasks.register('encrypt', JasyptCliTask) {
group 'jasypt'
description 'Encrypts a string using the Jasypt CLI'
input = project.properties['input'] ?: null
password = project.properties['password'] ?: System.getenv('JASYPT_ENCRYPTOR_PASSWORD') ?: null
isEncryptionCli = true
}
tasks.register('decrypt', JasyptCliTask) {
group 'jasypt'
description 'Decrypts a string using the Jasypt CLI'
input = project.properties['input'] ?: null
password = project.properties['password'] ?: System.getenv('JASYPT_ENCRYPTOR_PASSWORD') ?: null
isEncryptionCli = false
}
使用
# 加密
# 输出结果:giBl8R01EFIFIUlZYFA1HBq501gm5QnQcsuK2veUk4EWdtuHcMsR9CQjiRy8CPsW
# 同一段明文和密钥每次加密结果不一定一样
gradle encrypt -Pinput=123456abcde -Ppassword=y04WKoRO75uMilkYCcpIU6nFVxsawQzv
# 解密
gradle decrypt -Pinput=giBl8R01EFIFIUlZYFA1HBq501gm5QnQcsuK2veUk4EWdtuHcMsR9CQjiRy8CPsW -Ppassword=y04WKoRO75uMilkYCcpIU6nFVxsawQzv