1、需求
對於一些配置文件裏的敏感信息,如數據庫密碼、部分對接的賬號密碼之類的數據,進行加密存儲。不讓密碼明文暴露在配置文件中。
2、springboot項目集成 jasypt的三種使用方式
MD5密碼加密,非對稱RSA公鑰加密私鑰解密,自定義算法加解密
2.1、引入相關依賴
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
2.2、是否需要在啓動類添加註解
一般springboot項目的啓動類都有@SpringBootApplication 所以也包含了@EnableAutoConfiguration
所以使用jasypt只需要引入依賴,然後在配置文件中配置加密的密碼,即可以在項目啓動時對密文進行解密。
詳情看官方文檔 https://github.com/ulisesbocchio/jasypt-spring-boot/blob/master/README.md
2.3、配置文件配置加密密碼
jasypt:
encryptor:
password: abcqwe
algorithm: PBEWithMD5AndDES
2.4、生成密文示例代碼
public static void main(String[] args) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
//加密所需的salt(鹽)
textEncryptor.setPassword("abcqwe");
//要加密的數據(數據庫的用戶名或密碼)
String username = textEncryptor.encrypt("root");
String password = textEncryptor.encrypt("root123");
System.out.println("username:"+username);
System.out.println("password:"+password);
}
生成代碼後,替換掉配置文件的明文數據,用ENC(newpassword)的形式即可。
當然也不一定是用ENC()包裹密文,可以自定義前綴後綴,例如:
password: ENC(jdiakjd3wq89awdak13joiawdqwji)
這種是最簡單的,安全性也是最低的,拿到配置文件和加密密碼後調用textEncryptor.decrypt就可以解密得到明文密碼。
所以一般使用這個的話會把密碼設置到啓動參數。不過也是感覺不太好用,稍微升級一下的話就用非對稱加密。
2.5、非對稱加密
配置文件改成
jasypt:
encryptor:
privateKeyFormat: PEM
privateKeyString: asidjqkwjoikqjojwqopdjqopjwdpoqkpoldkqwpoeikpqowieopqiwepoqiwpoe
默認是用公鑰加密,然後配置的私鑰解密,所以對應的密文就需要用公鑰加密後存儲。
這種方式比MD5的好一點,也差不多,也是公開的算法加密。
2.6、 自定義加密類
修改配置文件,配置好加解密的算法實現類
jasypt:
encryptor:
bean: customStringEncryptor
然後創建一個bean customStringEncryptor實現StringEncryptor接口,重寫加解密方法
比如簡單的在密文後加111,然後解密就把最後的111去掉,實際使用就隨意發揮了,可以多重加密解密
import org.jasypt.encryption.StringEncryptor;
import org.springframework.stereotype.Component;
/**
* @author : itmamba
* @version 1.0
* @date : 2021/6/10 21:59
*/
@Component("customStringEncryptor")
public class CustomStringEncryptor implements StringEncryptor {
@Override
public String encrypt(final String message) {
return message+"111";
}
@Override
public String decrypt(final String encryptedMessage) {
return encryptedMessage.substring(0,encryptedMessage.indexOf("111"));
}
}
3、jasypt 實現原理以及源碼淺讀分析
源碼地址:https://github.com/ulisesbocchio/jasypt-spring-boot
集成jasypt後啓動項目首先可以看到一個Converter轉換器 EncryptablePropertySourceConverter
這個作用就是 將environment的PropertySource轉換成EncryptablePropertySource
這樣就可以對配置文件中的密文進行解密
這個工具組件有四個比較關鍵的類可以自定義使用:Filter、Resolver、Detector、StringEncryptor
上述用到的自定義加解密算法就是實現StringEncryptor接口。其他的需要自定義前後綴之類的可以參考官方文檔使用。
不自定義實現的話也會默認加載一些 lazy 開頭的實現類。例如 lazyEncryptablePropertyFilter、lazyEncryptablePropertyDetector等。
lazyEncryptablePropertyDetector 作用就是過濾出需要解密的配置,然後去掉前後綴,再進行解密。
例如redis和datasource設置連接屬性時就是在JavaBeanBinder的bind方法裏,對RedisProperties 和 DatasourceProperties setValue時,設置瞭解密後的明文。
4、注意事項及常見問題
注意事項:使用時最好對比下版本,不同的springboot版本使用合適的jasypt版本。
遇到問題:項目啓動正常,但是進行數據庫訪問時報異常。
原因:Hikari 連接池在springboot2.1.5前有默認創建連接,之後好像是沒有的,可以關注啓動時的日誌,看啓動時有沒打印hikari starting
即興記錄部分,接入項目還有問題未解決...
解決完再詳細續寫...
未完待續....