在我們傳統的基于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=加密密碼
⚠️加密密碼必須與之前給屬性加密時用的加密密碼一緻。