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.java
和ApplicationInner.java
,分別使用外部Tomcat和內置的Tomcat啓動。相關配置請查詢相關資料。
2.1.3 解密密文
SpringBoot運行時從配置文件中獲取的是密文,因此還需要向其提供祕鑰進行解密:
- 將祕鑰存放在配置文件中。
// application.yaml jasypt: encryptor: password: pswd@123
- 以系統參數的方式設置。
// Application.java @SpringBootApplication public class Application { public static void main(String[] args) { System.setProperty("jasypt.encryptor.password", "pswd@123"); SpringApplication.run(Application.class, args); } }
- 與第2種相似,但不是放在源碼中,而是以VM參數的形式傳遞。
在啓動容器時,容器可能會將其打印到日誌。也可以通過相關進程查看指令獲取。-Djasypt.encryptor.password=pswd@123