在 Spring 开发中,为了保护配置文件中的敏感信息,比如数据库密码、云密钥等数据,需要对配置进行加密,而jasypt-spring-boot就为我们提供了这样的实现。

在 maven 中我们可以使用mvn jasypt:encrypt-value或者mvn jasypt:decrypt-value通过命令行对数据进行加解密,gradle 也有相应的工具:

但都不是官方维护,有一定的风险,出了问题解决起来比较麻烦。

添加 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

参考资料