【SpringBoot實踐】加密配置信息

0 修訂

時間 描述
2019-04-18 建檔

1 簡介

公司突然要求應用配置中的敏感信息不能以明文的形式存在。

2 方案

2.1 Jasypt

2.1.1 添加依賴

Jasypt存在一個與SpringBoot的適配:

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

在研究過程中,我最初使用的是SpringBoot 2.0.4.RELEASE + jasypt-spring 1.8。但在啓動時報棧溢出,將後者調高到2.1.1版本後就正常了。

2.1.2 加密明文

jasypt-[version].jar包的路徑下的加密命令格式如下:

java -cp jasypt-[version].jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=[plaintext] password=[secretkey] algorithm=[algorithm]

其中:

  • version:Jasypt的版本
  • plaimtext:明文文本
  • secretkey:加密祕鑰
  • algorithm:加密算法。可選,默認爲PBEWithMD5AndDES

以數據庫賬號和密碼爲例。利用java指令直接執行Jasypt對密碼“root”進行加密:

E:\repo\org\jasypt\jasypt\1.9.2>java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=root password=pswd@123

----ENVIRONMENT-----------------

Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.102-b14

----ARGUMENTS-------------------

input: root
password: pswd@123

----OUTPUT----------------------

jARjFJYnvdi7QpPJ6aNmig==

OUTPUT部分就是加密後的密文(ciphertext)。將配置中的明文密碼替換爲以下內容:

spring.datasource.password=ENC(jARjFJYnvdi7QpPJ6aNmig==)

也可以利用測試環境完成上述工作。但在研究過程中發現,如果使用的是外部Tomcat啓動應用程序,則無法正常運行測試環境。所以我將入口拆分成了兩個:ApplicationOuter.javaApplicationInner.java,分別使用外部Tomcat和內置的Tomcat啓動。相關配置請查詢相關資料。

2.1.3 解密密文

SpringBoot運行時從配置文件中獲取的是密文,因此還需要向其提供祕鑰進行解密:

  1. 將祕鑰存放在配置文件中。
    // application.yaml
    jasypt:
        encryptor:
            password: pswd@123
    
  2. 以系統參數的方式設置。
    // Application.java
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            System.setProperty("jasypt.encryptor.password", "pswd@123");
            SpringApplication.run(Application.class, args);
        }
        
    }
    
  3. 與第2種相似,但不是放在源碼中,而是以VM參數的形式傳遞。
    -Djasypt.encryptor.password=pswd@123
    
    在啓動容器時,容器可能會將其打印到日誌。也可以通過相關進程查看指令獲取。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章