SpringBoot集成Jasypt敏感信息加密的操作方法
前言
在互聯(lián)網(wǎng)遍布社會各個角落的時代,伴隨著的是安全問題總是層出不窮。 19年4月,根據(jù)深圳市人民檢察院微信消息,深圳某知名無人機企業(yè)的工程師因為泄露公司源代碼到開源社區(qū)Github上而造成了公司巨大的損失,最終被判處有期徒刑6個月,罰款20萬元。
一般公司的核心業(yè)務(wù)代碼中,都會存在與數(shù)據(jù)庫、第三方通信的secret key等敏感信息,如果以明文的方式存儲,一旦泄露,那將會給公司帶來巨大的損失。 然而,許多中小型公司開發(fā)者對這方面的管理不夠規(guī)范,所以很多敏感信息都是直接以明文形式存放到代碼中,這樣的項目存在的安全風(fēng)險非常大。
本篇文章通過講解:Springboot集成Jasypt對項目敏感信息進行加密,提高系統(tǒng)的安全性。
哪些信息需要加密
一個系統(tǒng)中,一般和數(shù)據(jù)庫、第三方系統(tǒng)等交互的信息都會存在相應(yīng)的配置文件中,在配置文件中,所有涉及到信息安全的配置項都不應(yīng)該以明文的形式存儲,否則,一旦配置文件泄露,則會引出巨大的安全問題,常見的需要加密的信息項如下:
- 訪問數(shù)據(jù)庫、緩存等涉及到的賬號密碼
- 與第三方系統(tǒng)交互的access key、秘鑰
- 其他涉及第三方通信的信息
敏感信息加密的作用
第一:是為了防止人為誤操作將代碼泄漏時,第三方能夠簡單獲取到系統(tǒng)中的敏感信息,從而可能對系統(tǒng)、數(shù)據(jù)庫等造成破壞。
其次是一般系統(tǒng)上線都會有代碼安全檢測的流程,像賬號、密碼等敏感數(shù)據(jù)以明文形式存儲,一般都是審核不通過的,因此需要進行加密處理。
最后,作為一名開發(fā)者,應(yīng)該對自我有更高的要求,在開發(fā)過程中應(yīng)該要考慮到潛在的風(fēng)險,提供相應(yīng)的處理預(yù)案。
選擇加密的組件
開源社區(qū)強大之處在于:有需求就有人奉獻(xiàn)。Jasypt(全稱:Java Simplified Encryption),它是一個Java類庫,支持開發(fā)者無需深入 了解密碼學(xué)相關(guān)工作原理,花費最小的代碼在項目中添加基本的加密功能。
Jasypt官方使用文檔:http://www.jasypt.org/
項目集成Jasypt方式
jasypt-spring-boot組件則是Jasypt提供對Springboot項目集成的依賴,剛好符合我們的需求,它支持以下3種方式集成到項目中。
方式一
在Springboot應(yīng)用程序中,如果使用了@SpringBootApplication or @EnableAutoConfiguration注解,則可以直接在pom文件中添加jasypt-spring-boot依賴,然后就可以在整個Spring環(huán)境中使用jasypt對屬性進行加解密操作(屬性包括:系統(tǒng)屬性、環(huán)境屬性、命令行參數(shù)、properties、yml以及任何其他屬性源)。
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version> </dependency>
方式二
如果項目中沒有使用到@SpringBootApplication or @EnableAutoConfiguration注解,則可以通過以下兩個步驟完成對Jasypt的集成。
步驟一:pom文件引入jasypt依賴
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <version>3.0.4</version> </dependency>
步驟二:在配置類中,添加@EnableEncryptableProperties注解,示例如下:
@Configuration @EnableEncryptableProperties public class MyApplication { ... }
通過這種方式,你的項目一樣可以集成Jasypt,并且可加密屬性也可以在整個Spring環(huán)境中啟用(屬性包括:系統(tǒng)屬性、環(huán)境屬性、命令行參數(shù)、properties、yml以及任何其他屬性源)。
方式三
如果項目中沒有使用到@SpringBootApplication or @EnableAutoConfiguration注解,又不想在整個Spring環(huán)境中啟用加密的屬性,則可以使用該種方式,具體步驟如下:
步驟一:pom文件引入jasypt依賴
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <version>3.0.4</version> </dependency>
步驟二、在配置類中,使用@EncryptablePropertySource注解添加任意數(shù)量想要生效加密屬性的配置文件路徑,與Spring中@PropertySource注解的使用類似,示例如下:
@Configuration @EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties") public class MyApplication { ... }
同時,還可以使用@EncryptablePropertySources 注解對@EncryptablePropertySource配置進行分組,示例如下:
@Configuration @EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"), @EncryptablePropertySource("classpath:encrypted2.properties")}) public class MyApplication { ... }
說明:從Jasypt 1.8版本開始,@EncryptablePropertySource注解支持配置YAML文件
Springboot整合Jasypt實戰(zhàn)
一、引入依賴
說明,本項目使用技術(shù)棧是spring-boot+jasypt,故使用上面介紹的第一種方式來在項目中集成Jasypt,文章中只截取部分核心代碼,全部代碼會開發(fā)到Github和Gitee上。
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version> </dependency>
二、配置文件中添加Jasypt配置信息
1、配置jasypt參數(shù)
jasypt: encryptor: # 配置加密算法 algorithm: PBEWithMD5AndDES iv-generator-classname: org.jasypt.iv.NoIvGenerator property: # 算法識別前綴(當(dāng)算法發(fā)現(xiàn)配置文件中的值以這前綴開始,后綴結(jié)尾時,會使用指定算法解密) prefix: IT( # 算法識別后綴 suffix: )
2、配置加密算法秘鑰 (該秘鑰不能直接放在配置文件中,下面會具體總結(jié)秘鑰存放的方式,從而保證安全性)
三、使用Jasypt對數(shù)據(jù)庫賬號和密碼加密,并替換明文。
替換后的配置信息:
spring: application: name: Jasypt-Learning datasource: url: jdbc:mysql://localhost:3306/user2?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai username: IT(MIJueAfnYWsKa2kiR8Qrrw==) password: IT(qH9m5vjj8RYULOASKdhlOw==) server: port: 9090 # 配置jasypt相關(guān)信息 jasypt: encryptor: # 配置加密算法 algorithm: PBEWithMD5AndDES iv-generator-classname: org.jasypt.iv.NoIvGenerator property: # 算法識別前綴(當(dāng)算法發(fā)現(xiàn)配置文件中的值以這前綴開始,后綴結(jié)尾時,會使用指定算法解密) prefix: IT( # 算法識別后綴 suffix: )
Jasypt加密有3種方式,具體如下:
方式1、使用代碼生成加密串,代碼工具如下:
public static void main(String[] args) { String username = encrypt("root"); String password = encrypt("123456"); System.out.println(username); System.out.println(password); } /** * 加密 * @param plaintext 明文密碼 * @return */ public static String encrypt(String plaintext) { //加密工具 StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); //加密配置 EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); // 算法類型 config.setAlgorithm("PBEWithMD5AndDES"); //生成秘鑰的公鑰 config.setPassword("PEB123@321BEP"); //應(yīng)用配置 encryptor.setConfig(config); //加密 String ciphertext = encryptor.encrypt(plaintext); return ciphertext; } /** * 解密 * * @param ciphertext 待解密秘鑰 * @return */ public static String decrypt(String ciphertext) { //加密工具 StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); //加密配置 EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig(); config.setAlgorithm("PBEWithMD5AndDES"); //生成秘鑰的公鑰 config.setPassword("PEB123@321BEP"); //應(yīng)用配置 encryptor.setConfig(config); //解密 String pText = encryptor.decrypt(ciphertext); return pText; }
方式2、使用java cp命名對加密生成密文
參數(shù)說明:
- org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI是jasypt提供的一個用于加密的實體類
- org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI是jasypt提供的一個用于解密的實體類
- input表示需要加密的字符串如:密碼
- password表示本次加密算法使用的秘鑰
- algorithm表示加密算法的名稱。
特別說明: 通過該種方式獲取密文,需要到maven倉庫下jasypt-1.9.3.jar包所在的路徑下執(zhí)行,否則會報找不到對應(yīng)的主類。
// 加密命令 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input='root' password=abcdef algorithm=PBEWithMD5AndDES // 解密命令 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input='z4xP29fuY4wF2AJqp1NnoGJxj' password=abcdef algorithm=PBEWithMD5AndDES
方式3、使用jasypt-maven插件生成密文
該插件是jasypt官方提供,在pom中添加對應(yīng)依賴,然后使用mvn命令即可執(zhí)行加解密操作,具體如下:
// 1、在Pom中添加maven插件依賴 <plugin> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-maven-plugin</artifactId> <version>3.0.4</version> </plugin> // 2、加密命令 mvn jasypt:encrypt-value -Djasypt.encryptor.password="秘鑰的值" -Djasypt.plugin.value="需要加密的敏感信息" // 解密命令 mvn jasypt:decrypt-value -Djasypt.encryptor.password="秘鑰的值" -Djasypt.plugin.value="需要解密的密文"
四、查看執(zhí)行結(jié)果
使用中的一些坑
使用過程中遇到了許多不可預(yù)估的問題,特意總結(jié)出來,方便讀者參考。
1、使用jasypt3.0啟動時報:Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String
官方描述,3.0后默認(rèn)支持的算法為PBEWITHHMACSHA512ANDAES_256 ,該種加密方式由sha512 加 AES 高級加密組成,需要JDK1.9以上支持或者添加JCE(Java Cryptography Extension無限強度權(quán)限策略文件)支持,否則運行會出現(xiàn)錯誤。
解決方式:
方式1、將加密算法替換成PBEWithMD5AndDES 算法,并配置iv-generator-classname: 為org.jasypt.iv.NoIvGenerator值
方式2、降低jasypt的版本 - 使用2.x的版本
2、加解密秘鑰如何存儲
如果秘鑰寫在代碼或者配置文件,一旦代碼泄露,那別人就可以使用秘鑰解密我們的密文,這樣對敏感信息加密的作用就不存在了,因此,秘鑰不能以明文形式存儲在代碼或者配置文件中,下面就介紹一些安全的存儲秘鑰的形式。
方式1、把秘鑰當(dāng)做程序啟動時的命令行參數(shù)(推薦),示例如下:
java -jar xxx.jar --jasypt.encryptor.password=秘鑰
方式2、把秘鑰當(dāng)做程序啟動時環(huán)境變量(推薦),示例如下:
java -Djasypt.encryptor.password=秘鑰 -jar xxx.jar
方式3、自定義加密、解密器邏輯(這個自定代碼,本文不展開講解,后續(xù)有需要重開一篇文章詳細(xì)講解)
如何避免Git泄露
因為開發(fā)者的疏漏,不小心將源碼提交到開源倉庫中的新聞不在少數(shù),作為一個開發(fā)團隊,如何采取一些有效的措施去最小程度防止出現(xiàn)這種情況呢? 除了本文介紹的對敏感信息加密,并合理保存秘鑰外,還有以下的一些方式可以參考。
方式1、更規(guī)范的代碼提交、推送制度、培養(yǎng)開發(fā)者的安全意識: 很多時候,代碼的泄露除了故意為之外,大多數(shù)是因為不小心導(dǎo)致,因此在項目中可以通過合理管控權(quán)限的方式來防止代碼泄露。
方式2、合理利用Git忽略文件(.gitignore): 通過gitignore文件配置匹配規(guī)則,最大程度避免敏感信息上傳到Git倉庫。
方式3、借助第三方工具,在提交、推送時檢測代碼是否有敏感數(shù)據(jù): 常見的如git-secrets,在提交前會對變更內(nèi)容做檢測,如果檢測到預(yù)期的提交內(nèi)容可能包含敏感信息,那它們將會拒絕提交。
方式4、代碼的Code Review: 團隊leader和成員之間可以互相合作,在代碼推送合并時檢測是否存在敏感數(shù)據(jù),這樣不僅可以排查出敏感數(shù)據(jù),還能夠?qū)W習(xí)彼此之間的一些編碼技巧。
問題探討
在編寫本篇文章內(nèi)容時,無意中看到一個消息:Nginx之父被俄羅斯警方帶走,起因是因為其老東家 Rambler舉報Nginx是他在就職期間的業(yè)務(wù)時間進行開發(fā)的一個軟件,Rambler認(rèn)為其應(yīng)該有該軟件代碼的所有權(quán)。
針對這一事件大家有什么看法呢?程序員在就職期間的業(yè)務(wù)時間開發(fā)或者編寫的項目應(yīng)該歸屬于公司?歡迎在文章下留言討論。
寫在最后
源代碼安全在技術(shù)企業(yè)中意味著競爭力、生命線,一旦泄露,輕則造成項目失敗,重則可能導(dǎo)致公司倒閉,這一關(guān)檢測的重要性不言而喻,作為一名開發(fā)者,也應(yīng)該時刻培養(yǎng)自己的安全意識,在編碼時規(guī)避掉相應(yīng)的風(fēng)險。
到此這篇關(guān)于SpringBoot集成Jasypt加密敏感信息的文章就介紹到這了,更多相關(guān)SpringBoot加密敏感信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot使用jasypt對配置文件加密加密數(shù)據(jù)庫連接的操作代碼
- SpringBoot整合Jasypt實現(xiàn)配置加密的步驟詳解
- Springboot集成Jasypt實現(xiàn)配置文件加密的方法
- 微服務(wù)SpringBoot整合Jasypt加密工具的場景分析
- SpringBoot整合jasypt實現(xiàn)敏感信息的加密詳解
- springboot 項目使用jasypt加密數(shù)據(jù)源的方法
- Jasypt對SpringBoot配置文件加密
- jasypt 集成SpringBoot 數(shù)據(jù)庫密碼加密操作
- SpringBoot 集成 Jasypt 對數(shù)據(jù)庫加密以及踩坑的記錄分享
- 基于Jasypt對SpringBoot配置文件加密
- 在SpringBoot中通過jasypt進行加密解密的方法
- SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密
相關(guān)文章
Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實例講解
這篇文章主要介紹了Thymeleaf 3.0 自定義標(biāo)簽方言屬性的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法
這篇文章主要介紹了Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04java使用內(nèi)存數(shù)據(jù)庫ssdb的步驟
這篇文章主要介紹了java使用內(nèi)存數(shù)據(jù)庫ssdb的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12SpringBoot使用Guava實現(xiàn)日志脫敏的示例代碼
本文主要介紹了SpringBoot使用Guava實現(xiàn)日志脫敏的示例代碼,使用Guava中的Strings、Maps和CharMatcher類來進行日志脫敏,保護敏感數(shù)據(jù)的安全,感興趣的可以了解一下2024-01-01