1. 程式人生 > >SpringBoot | 第三十七章:整合Jasypt實現配置項加密

SpringBoot | 第三十七章:整合Jasypt實現配置項加密

前言

近期在進行專案安全方面評審時,質量管理部門有提出需要對配置檔案中的敏高檔案進行加密處理,避免了資訊洩露問題。想想前段時間某公司上傳github時,把相應的生產資料庫明文密碼也一併上傳了,導致了相應的資料洩露問題。也確實,大部分專案無論開發、測試還是生產環境,相關的敏高資訊都是明文儲存的,也是一大安全隱患呀。所以今天來說說,如何對配置檔案進行加密操作。

一點知識

何為Jasypt

Jasypt是一個Java庫,允許開發人員以很簡單的方式新增基本加密功能,而無需深入研究加密原理。利用它可以實現高安全性的,基於標準的加密技術,無論是單向和雙向加密。加密密碼,文字,數字,二進位制檔案。

  1. 高安全性的,基於標準的加密技術,無論是單向和雙向加密。加密密碼,文字,數字,二進位制檔案...
  2. 整合Hibernate的。
  3. 可整合到Spring應用程式中,與Spring Security整合。
  4. 整合的能力,用於加密的應用程式(即資料來源)的配置。
  5. 特定功能的高效能加密的multi-processor/multi-core系統。
  6. 與任何JCE提供者使用開放的API

官網:http://www.jasypt.org/

SpringBoot整合Jasypt

SpringBoot中整合Jasypt,可直接使用開源的jasypt-spring-boot直接整合,使用簡單方便。

mark

常規整合示例

0.引入pom依賴

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

1.設定鹽值和修改相應需要加密的配置引數

# 需要解密的地方,使用ENC()進行包裹處理
okong.name=ENC(Xj7Ykn2O0Hni/tN4oojPfw==)

# 設定鹽值,生產環境中,切記不要直接進行設定,可通過環境變數、命令列等形式進行設定。
jasypt.encryptor.password=lqdev

簡單來說,就是在需要加密的值使用ENC()進行包裹,即:ENC(密文)。若想避免參數衝突,可修改字首和字尾,可以直接使用jasypt.encryptor.property.prefixjasypt.encryptor.property.suffix進行修改即可。

之後想往常一樣使用@Value("${}")

即可。

包含xml引入時

在一些使用javaBean配置和xml兩種混合模式時,使用第一種配置時,xml引數並未替換。此時看了官方文件,可以使用另一方式進行配置即可。

官方說明

0.引入pom依賴

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

其實就是不進行自動配置而已。

1.啟動類啟動方式修改。

@SpringBootApplication
@Slf4j
public class JasyptApplication {
	
	public static void main(String[] args) throws Exception {

//		SpringApplication.run(JasyptApplication.class, args);
		//使用自定義環境變數 實現一些特殊場景下的加密字元解密操作
		//若無額外的xml引入檔案需要解密時,可直接使用SpringApplication.run(JasyptApplication.class, args);即可
		//若想在引入的xml中使用,需要加入環境變數,如以下模式
		new SpringApplicationBuilder().environment(new StandardEncryptableEnvironment())
		.sources(JasyptApplication.class).run(args);
		log.info("spring-boot-jasypt-chapter37服務啟動!");
	}
}

其他配置項

KeyRequiredDefault Value
jasypt.encryptor.passwordTrue鹽值,根密碼
jasypt.encryptor.algorithmFalsePBEWithMD5AndDES
jasypt.encryptor.keyObtentionIterationsFalse1000
jasypt.encryptor.poolSizeFalse1
jasypt.encryptor.providerNameFalseSunJCE
jasypt.encryptor.providerClassNameFalsenull
jasypt.encryptor.saltGeneratorClassnameFalseorg.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.ivGeneratorClassnameFalseorg.jasypt.salt.NoOpIVGenerator
jasypt.encryptor.stringOutputTypeFalsebase64
jasypt.encryptor.proxyPropertySourcesFalsefalse

運維說明

為了方便運維人員對各類敏感金鑰進行加密操作,提供了自動化指令碼,方便生成相應的加密串。

金鑰(鹽值)儲存說明

本身加解密過程都是通過鹽值進行處理的,所以正常情況下鹽值加密串是分開儲存的。鹽值應該放在系統屬性命令列或是環境變數來使用,而不是放在配置檔案。

命令列示例

java -jar xxx.jar --jasypt.encryptor.password=xxx &

環境變數示例

設定環境變數:

# 開啟/etc/profile檔案
vim /etc/profile
# 檔案末尾插入
export JASYPT_PASSWORD = xxxx

啟動命令:

java -jar xxx.jar --jasypt.encryptor.password=${JASYPT_PASSWORD} &

bat指令碼

為了方便,簡單編寫了一個bat指令碼方便使用。

 @echo off
 set/p input=待加密的明文字串:
 set/p password=加密金鑰(鹽值):
 echo 加密中......
 java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI  input=%input% password=%password% algorithm=PBEWithMD5AndDES
 pause

注意:jasypt-1.9.2.jar 檔案需要和bat指令碼放在相同目錄下。此包可直接在示例專案中直接下載。

使用示例:

注意:相應加密串,每次加密的結果是不同的。

使用示例

參考資料

  1. https://github.com/ulisesbocchio/jasypt-spring-boot

  2. http://www.jasypt.org/

總結

本章節主要簡單介紹瞭如何使用jasypt對配置檔案進行加密操作。一些其他高階應用,可以檢視官方文件進行相關整合即可。整合起來相對來說比較簡單,注意是要對密碼(鹽值)的管理,需要進行安全把控下,建議運維人員針對每個專案進行不一樣的鹽值操作,避免一個專案洩露了,造成其他關聯項的資訊洩露。安全無大小呀,還是謹慎為妙!

最後

目前網際網路上很多大佬都有SpringBoot系列教程,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支援。若文中有所錯誤之處,還望提出,謝謝。

老生常談

  • 個人QQ:499452441
  • 微信公眾號:lqdevOps

公眾號

個人部落格:http://blog.lqdev.cn

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-37

原文地址:https://blog.lqdev.cn/2019/05/08/springboot/chap