下面是在Spring Boot项目中对属性文件中的账号密码进行加密的完整步骤,以MySQL的用户名为root
,密码为123321
为例:
步骤1:引入Jasypt依赖
在项目的pom.xml
文件中,添加Jasypt依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
步骤2:配置加密密码
在src/main/resources/application.yml
或application.properties
中,配置Jasypt的加密密码。将其替换为自己的密匙,例如:
jasypt:
encryptor:
password: lfsun666
确保将lfsun666
替换为自己的密匙。
步骤3:加密属性值
在application.yml
或application.properties
:
spring:
datasource:
username: root
password: 123321
步骤4:创建MyJasyptUtil类
创建一个用于加密和解密属性值的实用类,例如MyJasyptUtil
。这个类将使用Jasypt的BasicTextEncryptor
进行属性的加密和解密。以下是一个示例:
import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 用于加密和解密属性值的实用类,这个类将使用Jasypt的BasicTextEncryptor进行属性的加密和解密。
*/
@Component
public class MyJasyptUtil {
private final StringEncryptor stringEncryptor;
@Autowired
public MyJasyptUtil(StringEncryptor stringEncryptor) {
this.stringEncryptor = stringEncryptor;
}
public String encrypt(String input) {
return stringEncryptor.encrypt(input);
}
public String decrypt(String input) {
return stringEncryptor.decrypt(input);
}
}
步骤5:在应用中使用MyJasyptUtil
使用MyJasyptUtil
类来加密和解密属性值。示例:
import com.lfsun.demolfsunstudyjasypt.util.MyJasyptUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class MyJasyptService {
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Autowired
private MyJasyptUtil myJasyptUtil;
/**
* 保存加密后的凭据。
*/
public void saveCredentials() {
String encryptedUsername = myJasyptUtil.encrypt(username);
String encryptedPassword = myJasyptUtil.encrypt(password);
System.out.println("加密后的用户名和密码: " + encryptedUsername + ":" + encryptedPassword);
}
/**
* 检索解密后的凭据。
*/
public void retrieveCredentials() {
String decryptedUsername = myJasyptUtil.decrypt(username);
String decryptedPassword = myJasyptUtil.decrypt(password);
System.out.println("解密后的用户名和密码: " + decryptedUsername + ":" + decryptedPassword);
}
}
步骤6:测试
拿到加密后的用户名和密码然后替换到application.yml:
import com.lfsun.demolfsunstudyjasypt.service.MyJasyptService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
public class DemoLfsunStudyJasyptApplication {
public static void main(String[] args) {
/**
* 在应用启动后立即创建了一个 MyJasyptService 实例并调用了 saveCredentials 方法。
* 这并不是正确的方式来获取 Spring 管理的 Bean。
*
* Spring Boot 应用的 Bean 生命周期和管理是由 Spring 容器控制的,不应该手动创建 Bean 实例。
*
* 应该在 Spring 容器初始化后,使用 Spring 框架来获取 MyJasyptService Bean 并调用相应的方法。
*/
/*SpringApplication.run(DemoLfsunStudyJasyptApplication.class, args);
MyJasyptService myJasyptService = new MyJasyptService();
myJasyptService.saveCredentials();*/
// 正确的方式
ConfigurableApplicationContext context = SpringApplication.run(DemoLfsunStudyJasyptApplication.class, args);
MyJasyptService myJasyptService = context.getBean(MyJasyptService.class);
// 拿到加密后的用户名和密码
myJasyptService.saveCredentials();
// 用加密后的用户名和密码去覆盖真实的密码
// myJasyptService.retrieveCredentials();
}
}
取出密码:
// 拿到加密后的用户名和密码
// myJasyptService.saveCredentials();
// 用加密后的用户名和密码去覆盖真实的密码
myJasyptService.retrieveCredentials();
即可;
通过这些步骤,可以在Spring Boot项目中对属性文件中的账号密码进行加密,提高安全性。确保保护好加密密码(jasypt.encryptor.password
)以防止数据泄漏。