在Spring项目中,配置文件的内容默认都是明文的,但是对于敏感的信息,如数据库密码、密匙等,直接使用明文存在安全隐患。可以通过Jasypt工具包进行加解密。
在SpringBoot中引入Jasypt
jasypt版本和springBoot版本之间的对应关系如下:
- SpringBoot2.1.x 对应使用 jasypt2.10
- SpringBoot1.5.x 对应使用 jasypt1.5
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
编写Jasypt加密工具类
/**
* Jasypt 加密工具
*
* @author likai
* @Date 2022/2/14 17:59
*/
public class JasyptUtil {
private static final String PERIANTHS512ANODES_256 = "PBEWITHHMACSHA512ANDAES_256";
/**
* Jasypt加密
*
* @param plainText 待加密的原文
* @return String
*/
public static String encryptWithSHA512(String plainText, String secret) {
// 1. 获取解密工具实例
PooledPBEStringEncryptor encryptor = getPooledPBEStringEncryptor(secret);
// 2. 加密
return encryptor.encrypt(plainText);
}
/**
* Jasypt解密
*
* @param encryptedText 待解密密文
* @param secret 解密秘钥
* @return String
*/
public static String decryptWithSHA512(String encryptedText, String secret) {
// 1. 获取解密工具实例
PooledPBEStringEncryptor encryptor = getPooledPBEStringEncryptor(secret);
// 2. 解密
return encryptor.decrypt(encryptedText);
}
/**
* 获取解密工具实例
*
* @return PooledPBEStringEncryptor
*/
private static PooledPBEStringEncryptor getPooledPBEStringEncryptor(String secret) {
// 1. 创建加解密工具实例
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
// 2. 加解密配置
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(secret);
config.setAlgorithm(PERIANTHS512ANODES_256);
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);
return encryptor;
}
}
配置文件
#port
server.port=8088
#要加密配置
datasource.password=lkstarblog.top
#加密使用的盐值
jasypt.encryptor.password=lkstarblog
编写测试类
@Slf4j
@SpringBootTest(classes = EncryptApplication.class)
public class EncryptApplicationTest {
/**
* 配置中读取的密码
*/
@Value("${datasource.password}")
private String password;
/**
* 加密用的盐值
*/
@Value("${jasypt.encryptor.password}")
private String salt;
/**
* 数据加密
*/
@Test
public void testEncrypt(){
log.info("原始数据:"+password);
String encrypt = JasyptUtil.encryptWithSHA512(password, salt);
log.info("加密后的数据"+encrypt);
String decrypt = JasyptUtil.decryptWithSHA512(encrypt, salt);
log.info("解密后的数据"+decrypt);
}
}
运行测试类观察打印的日志:
2022-02-15 16:12:25.541 INFO 16836 --- [ main] com.lk.star.EncryptApplicationTest : 原始数据:lkstarblog.top
2022-02-15 16:12:26.283 INFO 16836 --- [ main] com.lk.star.EncryptApplicationTest : 加密后的数据2lt6tLTs+PE20zYo2YzLdWbTg1IP/HQEKVoeFOLtvHQQbaUHwuILNkl6KlFcXb8R
2022-02-15 16:12:26.291 INFO 16836 --- [ main] com.lk.star.EncryptApplicationTest : 解密后的数据lkstarblog.top
配置文件解密读取
将加密得到的密文,加上 ENC() 特殊标记,写入的配置文件。
#port
server.port=8088
#要加密配置
#datasource.password=lkstarblog.top
datasource.password=ENC(2lt6tLTs+PE20zYo2YzLdWbTg1IP/HQEKVoeFOLtvHQQbaUHwuILNkl6KlFcXb8R)
#加密使用的盐值
jasypt.encryptor.password=lkstarblog
编写测试类,看获取到的配置是否正确
/**
* 读取加密后的配置
* */
@Test
public void testDecrypt(){
log.info("datasource.password:"+password);
}
查看控制台打印日志
2022-02-15 16:17:06.669 INFO 12372 --- [ main] com.lk.star.EncryptApplicationTest : datasource.password:lkstarblog.top
加密密匙的配置
主要有如下两种方式处理加密密匙:
- 直接写入到SpringBoot的配置文件中
- 在启动命令中加入密钥
测试代码是写在配置文件中的,这样的作法并不安全。
在启动命令后配置上加密密匙
java -jar -Djasypt.encryptor.password=MySecret xxx.jar