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

前言

近期在進行項目安全方面評審時,質量管理部門有提出須要對配置文件中的敏高文件進行加密處理,避免了信息泄露問題。想一想前段時間某公司上傳github時,把相應的生產數據庫明文密碼也一併上傳了,致使了相應的數據泄露問題。也確實,大部分項目不管開發、測試仍是生產環境,相關的敏高信息都是明文存儲的,也是一大安全隱患呀。因此今天來講說,如何對配置文件進行加密操做。java

一點知識

何爲Jasypt

Jasypt是一個Java庫,容許開發人員以很簡單的方式添加基本加密功能,而無需深刻研究加密原理。利用它能夠實現高安全性的,基於標準的加密技術,不管是單向和雙向加密。加密密碼,文本,數字,二進制文件。git

  1. 高安全性的,基於標準的加密技術,不管是單向和雙向加密。加密密碼,文本,數字,二進制文件...
  2. 集成Hibernate的。
  3. 可集成到Spring應用程序中,與Spring Security集成。
  4. 集成的能力,用於加密的應用程序(即數據源)的配置。
  5. 特定功能的高性能加密的multi-processor/multi-core系統。
  6. 與任何JCE提供者使用開放的API

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

SpringBoot集成Jasypt

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

mark

常規集成示例

0.引入pom依賴數據庫

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

1.設置鹽值和修改相應須要加密的配置參數vim

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

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

簡單來講,就是在須要加密的值使用ENC()進行包裹,即:ENC(密文)。若想避免參數衝突,可修改前綴和後綴,能夠直接使用jasypt.encryptor.property.prefixjasypt.encryptor.property.suffix進行修改便可。安全

以後想往常同樣使用@Value("${}")便可。springboot

包含xml引入時

在一些使用javaBean配置和xml兩種混合模式時,使用第一種配置時,xml參數並未替換。此時看了官方文檔,可使用另外一方式進行配置便可。bash

官方說明

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服務啓動!");
	}
}

其餘配置項

Key Required Default Value
jasypt.encryptor.password True 鹽值,根密碼
jasypt.encryptor.algorithm False PBEWithMD5AndDES
jasypt.encryptor.keyObtentionIterations False 1000
jasypt.encryptor.poolSize False 1
jasypt.encryptor.providerName False SunJCE
jasypt.encryptor.providerClassName False null
jasypt.encryptor.saltGeneratorClassname False org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.ivGeneratorClassname False org.jasypt.salt.NoOpIVGenerator
jasypt.encryptor.stringOutputType False base64
jasypt.encryptor.proxyPropertySources False false

運維說明

爲了方便運維人員對各種敏感密鑰進行加密操做,提供了自動化腳本,方便生成相應的加密串。

密鑰(鹽值)存儲說明

自己加解密過程都是經過鹽值進行處理的,因此正常狀況下鹽值加密串是分開存儲的。鹽值應該放在系統屬性命令行或是環境變量來使用,而不是放在配置文件。

命令行示例

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/chapter-thirty-seven/

相關文章
相關標籤/搜索