下面是在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: rootpassword: 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;@Autowiredpublic 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;@Autowiredprivate 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
)以防止数据泄漏。