前言
近期在進行項目安全方面評審時,質量管理部門有提出需要對配置文件中的敏高文件進行加密處理,避免了信息泄露問題。想想前段時間某公司上傳github時,把相應的生產數據庫明文密碼也一並上傳了,導致了相應的數據泄露問題。也確實,大部分項目無論開發、測試還是生產環境,相關的敏高信息都是明文存儲的,也是一大安全隱患呀。所以今天來說說,如何對配置文件進行加密操作。
一點知識
何為Jasypt
Jasypt是一個Java庫,允許開發人員以很簡單的方式添加基本加密功能,而無需深入研究加密原理。利用它可以實現高安全性的,基於標准的加密技術,無論是單向和雙向加密。加密密碼,文本,數字,二進制文件。
- 高安全性的,基於標准的加密技術,無論是單向和雙向加密。加密密碼,文本,數字,二進制文件...
- 集成Hibernate的。
- 可集成到Spring應用程序中,與Spring Security集成。
- 集成的能力,用於加密的應用程序(即數據源)的配置。
- 特定功能的高性能加密的multi-processor/multi-core系統。
- 與任何JCE提供者使用開放的API
SpringBoot集成Jasypt
SpringBoot
中集成Jasypt
,可直接使用開源的jasypt-spring-boot
直接集成,使用簡單方便。
常規集成示例
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.prefix
和jasypt.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服務啟動!");
}
}
其他配置項
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腳本放在相同目錄下。此包可直接在示例項目中直接下載。
使用示例:
注意:相應加密串,每次加密的結果是不同的。
參考資料
總結
本章節主要簡單介紹了如何使用
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/