springboot jasypt2.x与jasypt3.x的使用方式
作者:头未秃
1、前言
如果我们把大量的配置信息都放在配置文件中是会有安全隐患的,那么如何消除这个隐患呢?
最直接的方式就是把配置信息中的一些敏感信息(比如数据库密码、中间件密码)加密,然后程序在获取这些配置的时候解密,就可以达到目的。
这个时候,jasypt框架就派上用场了。
2.x 版本的分析
如果引入的是 2.x 的版本,启动信息如下:
String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWithMD5AndDES
Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000
Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1
Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null
Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null
Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator
Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.NoIvGenerator
Encryptor config not found for property jasypt.encryptor.string-output-type, using default value: base64
通过以上信息的解读,我们可以了解到的信息如下:
默认加密算法:PBEWithMD5AndDES
默认的迭代次数: 1000
默认池大小: 1
默认生成盐的类:org.jasypt.salt.RandomSaltGenerator
默认IV生成器类:org.jasypt.iv.NoIvGenerator
默认输出类型:base64
3.x 版本分析
如果引入的是 3.x 的版本,启动信息如下:
String Encryptor custom Bean not found with name 'jasyptStringEncryptor'. Initializing Default String Encryptor
Encryptor config not found for property jasypt.encryptor.algorithm, using default value: PBEWITHHMACSHA512ANDAES_256
Encryptor config not found for property jasypt.encryptor.key-obtention-iterations, using default value: 1000
Encryptor config not found for property jasypt.encryptor.pool-size, using default value: 1
Encryptor config not found for property jasypt.encryptor.provider-name, using default value: null
Encryptor config not found for property jasypt.encryptor.provider-class-name, using default value: null
Encryptor config not found for property jasypt.encryptor.salt-generator-classname, using default value: org.jasypt.salt.RandomSaltGenerator
Encryptor config not found for property jasypt.encryptor.iv-generator-classname, using default value: org.jasypt.iv.RandomIvGenerator
Encryptor config not found for property jasypt.encryptor.string-output-type, using default value: base64
通过以上信息的解读,我们可以了解到的信息如下:
默认加密算法:PBEWITHHMACSHA512ANDAES_256
默认的迭代次数: 1000
默认池大小: 1
默认生成盐的类:org.jasypt.salt.RandomSaltGenerator
默认IV生成器类:org.jasypt.iv.RandomIvGenerator
默认输出类型:base64
2、使用
1. 引入pom包
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
2. 创建加密工具类生成密码
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
/**
* Jasyp加解密工具类
* @author chenxc
* @date 2020/4/14 14:28
*/
public class JasypUtil {
private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";
private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";
/**
* Jasyp2.x 加密(PBEWithMD5AndDES)
* @param plainText 待加密的原文
* @param factor 加密秘钥
* @return java.lang.String
*/
public static String encryptWithMD5(String plainText, String factor) {
// 1. 创建加解密工具实例
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
// 2. 加解密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm(PBEWITHMD5ANDDES);
config.setPassword(factor);
encryptor.setConfig(config);
// 3. 加密
return encryptor.encrypt(plainText);
}
/**
* Jaspy2.x 解密(PBEWithMD5AndDES)
* @param encryptedText 待解密密文
* @param factor 解密秘钥
* @return java.lang.String
*/
public static String decryptWithMD5(String encryptedText, String factor) {
// 1. 创建加解密工具实例
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
// 2. 加解密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm(PBEWITHMD5ANDDES);
config.setPassword(factor);
encryptor.setConfig(config);
// 3. 解密
return encryptor.decrypt(encryptedText);
}
/**
* Jasyp3.x 加密(PBEWITHHMACSHA512ANDAES_256)
* @param plainText 待加密的原文
* @param factor 加密秘钥
* @return java.lang.String
*/
public static String encryptWithSHA512(String plainText, String factor) {
// 1. 创建加解密工具实例
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
// 2. 加解密配置
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(factor);
config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
// 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
config.setKeyObtentionIterations( "1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
// 3. 加密
return encryptor.encrypt(plainText);
}
/**
* Jaspy3.x 解密(PBEWITHHMACSHA512ANDAES_256)
* @param encryptedText 待解密密文
* @param factor 解密秘钥
* @return java.lang.String
*/
public static String decryptWithSHA512(String encryptedText, String factor) {
// 1. 创建加解密工具实例
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
// 2. 加解密配置
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(factor);
config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);
// 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
config.setKeyObtentionIterations( "1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
// 3. 解密
return encryptor.decrypt(encryptedText);
}
public static void main(String[] args) {
String factor = "salt";
String plainText = "123456";
String encryptWithMD5Str = encryptWithMD5(plainText, factor);
String decryptWithMD5Str = decryptWithMD5(encryptWithMD5Str, factor);
String encryptWithSHA512Str = encryptWithSHA512(plainText, factor);
String decryptWithSHA512Str = decryptWithSHA512(encryptWithSHA512Str, factor);
System.out.println("采用MD5加密前原文密文:" + encryptWithMD5Str);
System.out.println("采用MD5解密后密文原文:" + decryptWithMD5Str);
System.out.println();
System.out.println("采用SHA512加密前原文密文:" + encryptWithSHA512Str);
System.out.println("采用SHA512解密后密文原文:" + decryptWithSHA512Str);
}
}也可以调用jasypt-1.9.2.jar包中一个main方法:org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI
注:jasypt2.x版本可以使用,3.x不能使用
找到maven仓库中的 jasypt-1.9.2.jar(路径是:xxx\repository\org\jasypt\jasypt\1.9.2)
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="test" password=salt algorithm=PBEWithMD5AndDES
- -- input参数:你想要加密的密码
- -- password参数:jasypt用来加密你的密码的密码
- -- algorithm加密方式:使用默认就好了
结果如下图,途中的output就是加密后的密文了。

3. 修改配置文件,把配置文件中要加密的字段改为:ENC(密文)
yml中添加
system:
mysql:
url: xxx.xxx.xx.xx
username: username
password: ENC(EM4fA1YBhd8OTcdl93w2QQ==)
jasypt:
encryptor:
password: salt那么新的问题又来了,你把密码盐放在配置文件中,这些密码加密就相当于没加密
5、将加密密钥作为启动运行参数
以上我们的密钥也是保存在配置文件中的,一旦密钥泄露,信息被解密,安全隐患依然存在!
因此我们可以通过将密钥设置为程序启动时的参数来避免!!!
java -Djasypt.encryptor.password=salt -jar test.jar
idea中如下配置运行:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
