天天看點

如何給application.yml檔案的敏感資訊加密?

作者:Java架構學習指南

在我們傳統的基于SpringBoot開發的項目中,在配置檔案裡,或多或少的都會有一些敏感資訊,這樣就會丢失一定的安全性,是以我們就需要,對敏感資訊進行加密。我們可以使用jasypt工具進行加密。

好了廢話不多說,直接進入正題:

1. 導入依賴

<dependency>  
    <groupId>com.github.ulisesbocchio</groupId>  
    <artifactId>jasypt-spring-boot-starter</artifactId>  
    <version>3.0.5</version>  
</dependency>           

我的Demo裡使用的是SpringBoot3.0之後的版本,是以大家如果像我一樣都是基于SpringBoot3.0之後的,jasypt一定要使用3.0.5以後的版本。

2. 使用jasypt

我們在配置檔案裡寫幾行配置

jasypt:  
  encryptor:  
    password: sdjsdbshdbfuasd  
    property:  
      prefix: ENC(
      suffix: )           
password是加密密碼,必須配置這一項,值可以随便輸入。 prefix和suffix是預設配置,也可以自定義,預設值就是ENC(和),這個是自動解密使用的。

2.1. 加/解密

jasypt 提供了一個工具類接口,StringEncryptor,這個接口提供了加解密方法。下面是他的源碼。

public interface StringEncryptor {  
  
    /**  
    * 加密輸入資訊  
    *  
    * @param 要加密的資訊  
    * @return 加密結果  
    */  
    public String encrypt(String message);  


    /**  
    * 解密加密資訊  
    *  
    * @param 加密資訊(encryptedMessage) 要解密的加密資訊  
    * @return 解密結果  
    */  
    public String decrypt(String encryptedMessage);  
  
}           

我們在 test 測試類中,将要進行加密的文本使用encrypt方法進行加密

@SpringBootTest  
@Slf4j  
class JasryptApplicationTests {  
  
    @Autowired  
    private StringEncryptor stringEncryptor;  

    @Test  
    void contextLoads() {  
        String username = stringEncryptor.encrypt("root");  
        String password = stringEncryptor.encrypt("root");  
        log.info("username encrypt is {}", username);  
        log.info("password encrypt is {}", password);  
        log.info("username decrypt is {}", stringEncryptor.decrypt(username));  
        log.info("password decrypt is {}", stringEncryptor.decrypt(password));  
    }  
  
}           

上邊代碼,加密的内容是,MySQL的使用者名和密碼,同時對它們進行加密和解密,你當然可以對任意配置資訊進行加解密操作。看看輸出内容:

2023-07-23T18:59:50.621+08:00  INFO 9489 --- [           main] c.e.jasrypt.JasryptApplicationTests      : username encrypt is 61zSoixtNayUruXt5x84kEKO9jGnZObTGCa1+k5Yg9F7qSUiZvp5fG31AMuVqrot
2023-07-23T18:59:50.621+08:00  INFO 9489 --- [           main] c.e.jasrypt.JasryptApplicationTests      : password encrypt is a6snCZCkbQFKkQqxN2bS18ags04yZxH+THwIL5RjGocEjG9sLkJvvasPFFVxEBWv
2023-07-23T18:59:50.623+08:00  INFO 9489 --- [           main] c.e.jasrypt.JasryptApplicationTests      : username decrypt is root
2023-07-23T18:59:50.630+08:00  INFO 9489 --- [           main] c.e.jasrypt.JasryptApplicationTests      : password decrypt is root           

加密預設使用的是PBEWITHHMACSHA512ANDAES_256加密 我們将密文,替換到資料源,配置:

spring:  
datasource:  
driver-class-name: com.mysql.cj.jdbc.Driver  
url: jdbc:mysql://localhost:3306/honey?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8  
username: ENC(61zSoixtNayUruXt5x84kEKO9jGnZObTGCa1+k5Yg9F7qSUiZvp5fG31AMuVqrot)  
password: ENC(a6snCZCkbQFKkQqxN2bS18ags04yZxH+THwIL5RjGocEjG9sLkJvvasPFFVxEBWv)           

⚠️注意别忘了加上字首和字尾,如上邊代碼。

這個時候就已經完成了,但是官方不建議我們将加密密碼放到配置檔案中,我們應作為系統屬性、指令行參數或環境變量傳遞,隻要其名稱是 jasypt.encryptor.password,就能正常工作。

我們可以将項目打為jar包然後使用 java -jar指令

java -jar jasrypt-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=加密密碼           

⚠️加密密碼必須與之前給屬性加密時用的加密密碼一緻。

繼續閱讀