springboot使用jasypt给配置文件密码加密

前言:我们可以对配置文件中的密码进行脱敏

依赖

<dependency>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-spring-boot-starter</artifactId>
	<version>3.0.2</version>
</dependency>

配置类

这里使用了配置文件中的 platform.jasypt.saltCode 的值作为加密的盐值后缀,如果没有配置就默认使用 projectCode 作为盐值后缀,配置文件没有配置的情况下完整盐值:prefixValue_projectCode

package con.pro.config;

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 加密配置类
 */
@Configuration
public class PropertiesEncryptorConfig {

    // 配置文件获取盐值后缀, 默认使用 saltKeyCode 作为后缀盐值
    @Value("${platform.jasypt.saltCode:saltKeyCode}")
    private String saltCode;

    // 默认bean名称为jasyptStringEncryptor,若要自定义bean名称,则需要在.properties配置项指定用到的加密bean,例如:jasypt.encryptor.bean=自定义bean名称
    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor jasyptStringEncryptor() {
        //集中式PBE字符串加密器
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        //简单字符串形式的PBC配置
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        //设置完整盐值:固定前缀+配置文件后缀,若配置文件未进行配置,则取默认后缀
        config.setPassword("prefixValue_" + saltCode);
        //设置使用的加密算法
        config.setAlgorithm("PBEWITHHMACSHA1ANDAES_256");
        //获取加密密钥散列迭代次数
        config.setKeyObtentionIterations("1000");
        //加密器池大小
        config.setPoolSize("1");
        //获取加密算法的java.security.Provider实现的名称(加密器的提供者)
        config.setProviderName("SunJCE");
        //设置盐生成器
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        //设置初始向量IV生成器的类名
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        //设置字节数组以base64格式输出
        config.setStringOutputType("base64");
        //将对应的配置设置到密码器上
        encryptor.setConfig(config);

        return encryptor;
    }

//    public static void main(String[] args) {
//        // 测试
//        StringEncryptor stringEncryptor = new PropertiesEncryptorConfig().jasyptStringEncryptor();
//        String password = "123456";
//        String encrypt = stringEncryptor.encrypt(password);
//        String decrypt = stringEncryptor.decrypt(encrypt);
//        System.out.println("原始: " + password);
//        System.out.println("加密: " + encrypt);
//        System.out.println("解密: " + decrypt);
//    }

}

在配置文件中使用

直接在 application.properties 配置文件中使用 ENC 包裹住加密后的密码即可,他就会自动解析了

# 加密前
# gateway.api.password=123456
# 加密后
gateway.api.password=ENC(OwLaSNWcGGvSFQ4G1hvG8TvUAdU9odhdDcmQaBAiBni3TIUEDFwdO67xla7/+s1Z)

# 加密后
spring.datasource.druid.password=ENC(F971EmBsRpLI6A/BAtzQ15+QPqc9fnzmfcE5OnCgIekvF7TTKmjrWo+qvDpks/sb)

PS 介绍一种使用jar包执行jar命令方式生成加密解密(仅适合已安装jdk环境下执行)

#加密
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=“zhilin123!@#” password=saltnewfor algorithm=PBEWITHHMACSHA1ANDAES_256 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator
#解密
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input=“hJ1yk5sGHRIMaoIG18ZjicpkeechjdeKlbzTPN3j5YjJDPxHNX/vEHcCDujwUVIg” password=saltnewfor algorithm=PBEWITHHMACSHA1ANDAES_256 ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator

input:待加密/解密值

password:盐值

algorithm:加密算法

ivGeneratorClassName:初始向量IV生成器的类名,根据不同的算法,有些算法需要,有些则不需要,比如PBEWITHHMACSHA1ANDAES_256算法就需要,不带这个参数,则会报错:Operation not possible (Bad input or parameters)


版权声明:本文为weixin_44953227原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。