1. 背景
在配置文件中配置公网数据库时需要对认证信息进行加密,以此来保障系统安全性,可以通过Jasypt来进行加密。
2. 前期准备
2.1. 依赖导入
本文使用Maven进行依赖导入,在pom.xml中添加依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
需要注意的是,请根据Java版本来选择适合的 Jasypt 版本。若使用的是 JDK 8,则是对应 2.x,而对于 JDK 9 及以上版本,则应选择 3.x 版本。
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
3. 生成密钥
Jasypt通过密钥
来对明文密码进行加密,所以需要提供一个密钥,该密钥需为ASSIC码。
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;
import org.junit.Test;
public class JasyptTest {
// 加密的密钥,必须为ASCll码
private String privateKey = "这里存放自定义的密钥";
//生成加密后的密码
@Test
public void testEncrypt() throws Exception {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
EnvironmentPBEConfig config = new EnvironmentPBEConfig();
// 加密的算法,这个算法是默认的
config.setAlgorithm("PBEWithMD5AndDES");
config.setPassword(privateKey);
standardPBEStringEncryptor.setConfig(config);
String plainText = "准备加密的明文密码";
String encryptedText = standardPBEStringEncryptor.encrypt(plainText);
System.out.println("用于加密的密钥: " + privateKey);
System.out.println("加密后的密码: " + encryptedText);
}
//解密测试
@Test
public void testDe() throws Exception {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
EnvironmentPBEConfig config = new EnvironmentPBEConfig();
config.setAlgorithm("PBEWithMD5AndDES");
config.setPassword(privateKey);
standardPBEStringEncryptor.setConfig(config);
String encryptedText = "填写已加密的密码";
String plainText = standardPBEStringEncryptor.decrypt(encryptedText);
System.out.println("用于加密的密钥: " + privateKey);
System.out.println("用于解密的密码: " + encryptedText);
System.out.println("解密后的密码:" + plainText);
}
}
4. 配置文件应用
此时我们拥有两个信息,一个为用于加密的密钥
,一个为加密过后的密码
。在application.yml中添加如下配置:
在数据库配置那里密码必须为ENC()包裹。
jasypt:
encryptor:
password: 加密的密钥
# 注意:官方说明中只要求password必填,但后面两项也要填上,否则出现错误
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
# 示例
spring:
datasource:
password: ENC(加密过后的密码)
定义测试接口,查看是否成功获取到解密后的密码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Value("${spring.datasource.password}")
private String decryptedPassword;
@GetMapping("/password")
public String hello(){
return "Decrypted Password: " + decryptedPassword;
}
}
最后访问项目地址/test/password,查看获取到是否为解密后的密码!