一、前言
在工作中遇到需要把配置檔案加密的要求,很容易就在網上找到了開源插件 jasypt (https://github.com/ulisesbocchio/jasypt-spring-boot#customEncryptor),根據官方說明和網上其他示例很容易搞定加密解密,但是本功能要求使用自定義的加密解密方法,查了下網上沒有示例,于是看了下官方文檔中關于自定義加密解密的部分說明。
官方說明表達的意思為如果你需要自定義加密解密那麼就在Spring Context中定義自己的StringEncryptor bean,這樣将忽略預設加密器。官方預設的bean的名稱為
@Bean(“ jasyptStringEncryptor ”)
但是我們可以通過官方提供的 jasypt.encryptor.bean=你自己定義的名稱
進行更改(開始1.5以上版本,需要寫在配置檔案中這裡為Property檔案格式 yml檔案格式類似隻是将.換成層級結構)
jasypt:
encryptor:
bean: aaa
這個bean要求傳回一個對象,這個對象實作了一個名字叫做StringEncryptor接口,也就是說我們自己實作的這個接口中的方法的話就可以代替官方指定的加密解密方法了。而且如果是自己實作加密解密方法也代表我們不一定有必要把密匙放到配置檔案中(這一句不明白的可以看一下其他網上實作的标準示例)。
二、具體實作
第一步我們先在pom.xml檔案中引用這個開源插件
<!-- 加密解密 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
首先我們實作StringEncryptor接口,該接口中的兩個方法分别是encrypt(加密方法),decrypt(解密方法)
import org.jasypt.encryption.StringEncryptor;
public class DESEncrypt implements StringEncryptor {
//加密
@Override
public String encrypt(String message) {
try {
return 自己定義的方法的傳回值;//如果方法中包含加密密匙那麼就完全沒必要在配置檔案中寫
} catch (Exception e) {
e.printStackTrace();
return message;
}
}
//解密
@Override
public String decrypt(String encryptedMessage) {
try {
return 自己定義的方法的傳回值;
} catch (Exception e) {
e.printStackTrace();
return encryptedMessage;
}
}
}
然後我們去定義一下相應的bean
import org.jasypt.encryption.StringEncryptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EncryptionConfig {
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
DESEncrypt desEncrypt = new DESEncrypt();//調用我們自己實作的類即可
return desEncrypt;
}
}
改動的話隻有這兩個檔案 如果不實作官方其他的自定義的話 配置檔案中的更改沒什麼變化和标準實作一樣
spring.datasource.username=ENC(zj4OUZ3/mmHV0JOgCdg8qQ==)
隻不過enc括号裡面的加密資訊是有你自己的加密方法生成的
很簡便的幾部就能完成自定義操作。