前言:我们可以对配置文件中的密码进行脱敏
<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)