SpringBoot使用jaspyt對配置文件加密

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

 

 

即興記錄部分,接入項目還有問題未解決...

解決完再詳細續寫...

未完待續....

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章