Spring Boot项目中通过 Jasypt 对属性文件中的账号密码进行加密

下面是在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.ymlapplication.properties中,配置Jasypt的加密密码。将其替换为自己的密匙,例如:

jasypt:
  encryptor:
    password: lfsun666

确保将lfsun666替换为自己的密匙。

步骤3:加密属性值

application.ymlapplication.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)以防止数据泄漏。

猜你喜欢

转载自blog.csdn.net/qq_43116031/article/details/134278178
今日推荐