SpringBoot集成Jasypt實(shí)現(xiàn)敏感信息加密保護(hù)功能
前言
在數(shù)字化時(shí)代背景下,互聯(lián)網(wǎng)滲透生活的方方面面,同時(shí)也帶來了日益嚴(yán)峻的安全挑戰(zhàn)。曾有知名企業(yè)工程師因?qū)⒐竞诵拇a上傳至開源平臺(tái)導(dǎo)致公司損失慘重,受到法律制裁。這一事件暴露出企業(yè)對(duì)代碼與配置信息保護(hù)的薄弱環(huán)節(jié)。
企業(yè)核心系統(tǒng)通常會(huì)在配置文件中存儲(chǔ)數(shù)據(jù)庫連接信息、第三方接口秘鑰等敏感數(shù)據(jù)。如果以明文存在,一旦泄露,極易被惡意利用,造成嚴(yán)重經(jīng)濟(jì)和信譽(yù)損失。尤其是中小企業(yè),在安全合規(guī)方面常存在疏漏,敏感信息暴露風(fēng)險(xiǎn)更大。
因此,采用有效的敏感信息加密手段不僅是保護(hù)知識(shí)產(chǎn)權(quán)和業(yè)務(wù)安全的必要舉措,也符合行業(yè)安全規(guī)范和合規(guī)要求,能有效降低因信息泄露帶來的安全風(fēng)險(xiǎn)。
哪些類型的敏感信息必須加密
- 數(shù)據(jù)庫用戶名和密碼
- 緩存、消息隊(duì)列等服務(wù)的認(rèn)證信息
- 第三方服務(wù)的 Access Key、Secret Key
- 其他涉及系統(tǒng)間安全通信的憑證信息
以上信息若在配置文件中以明文形式存在,易成為攻擊目標(biāo),因此必須采取加密手段保護(hù)。
敏感信息加密的核心價(jià)值
- 防止泄漏風(fēng)險(xiǎn)放大:即使代碼或配置文件泄露,密文因無法被直接識(shí)別,降低信息被直接利用的風(fēng)險(xiǎn)。
- 符合安全合規(guī)機(jī)制要求:很多安全評(píng)審流程要求敏感信息不得以明文暴露,加密處理是審核通過前提。
- 提升開發(fā)者安全意識(shí):引導(dǎo)整個(gè)團(tuán)隊(duì)對(duì)安全問題保持高度警惕,減少人為失誤造成的安全隱患。
選擇 Jasypt 作為加密解決方案的理由
Jasypt(Java Simplified Encryption)是一個(gè)簡潔、功能強(qiáng)大的Java加密庫。其設(shè)計(jì)宗旨在于:
- 開發(fā)者無需深入密碼學(xué)細(xì)節(jié)即可輕松實(shí)現(xiàn)數(shù)據(jù)加解密
- 兼具開箱即用的 Spring Boot 集成支持
- 支持多種加密算法和配置選項(xiàng)
- 簡化配置文件中敏感配置的加密解密流程
Jasypt 官網(wǎng)項(xiàng)目地址:www.jasypt.org/
Spring Boot 集成 Jasypt 的多種方式
通用集成(基于自動(dòng)配置)
針對(duì)絕大多數(shù) Spring Boot 項(xiàng)目,可以直接引入 jasypt-spring-boot-starter 依賴,無需額外配置,自動(dòng)完成環(huán)境整合。支持對(duì)配置文件中帶有特定前后綴的密文自動(dòng)解密。
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version> </dependency>
無自動(dòng)配置環(huán)境下啟用加密屬性
如果項(xiàng)目未使用 @SpringBootApplication 或 @EnableAutoConfiguration,需要:
- 引入
jasypt-spring-boot依賴(非starter) - 在配置類添加注解
@EnableEncryptableProperties
@Configuration
@EnableEncryptableProperties
public class JasyptConfig {
// 其他配置
}
對(duì)指定配置文件啟用加密支持
無需在整個(gè) Spring 環(huán)境開啟加密屬性的情況下,可以指定應(yīng)用哪些配置文件支持加解密:
@Configuration
@EncryptablePropertySource("classpath:encrypted.properties")
public class JasyptConfig {
}
對(duì)于多配置文件支持:
@Configuration
@EncryptablePropertySources({
@EncryptablePropertySource("classpath:encrypted1.properties"),
@EncryptablePropertySource("classpath:encrypted2.properties")
})
public class JasyptConfig {
}
Jasypt 1.8 版本以后也支持 YAML 配置文件。
實(shí)戰(zhàn)演練:Spring Boot 項(xiàng)目中 Jasypt 集成示例
引入依賴
采用自動(dòng)配置方式,pom中添加:
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version> </dependency>
配置 Jasypt 加密參數(shù)
在 application.yml 中添加如下配置信息:
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
property:
prefix: IT(
suffix: )
這里指定了加密算法為經(jīng)典的 PBEWithMD5AndDES,同時(shí)定義了加密數(shù)據(jù)的前后綴,方便 Jasypt 自動(dòng)識(shí)別哪些配置需要解密。
將敏感信息加密替換到配置文件中
例如,將數(shù)據(jù)庫賬號(hào)密碼替換為密文格式:
spring:
datasource:
url: jdbc:mysql://localhost:3306/user2?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
username: IT(MIJueAfnYWsKa2kiR8Qrrw==)
password: IT(qH9m5vjj8RYULOASKdhlOw==)
注意:加密內(nèi)容必須以配置的前綴 IT( 開始,后綴 ) 結(jié)束。
生成密文的多種方案
方案一:使用代碼方式加密
示例代碼:
public class JasyptEncryptUtils {
private static final String ALGORITHM = "PBEWithMD5AndDES";
private static final String PASSWORD = "PEB123@321BEP";
public static String encrypt(String plaintext) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm(ALGORITHM);
config.setPassword(PASSWORD);
encryptor.setConfig(config);
return encryptor.encrypt(plaintext);
}
public static String decrypt(String ciphertext) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm(ALGORITHM);
config.setPassword(PASSWORD);
encryptor.setConfig(config);
return encryptor.decrypt(ciphertext);
}
public static void main(String[] args) {
System.out.println(encrypt("root"));
System.out.println(encrypt("123456"));
}
}
方案二:利用命令行工具加密
在 jasypt-1.9.3.jar 包路徑下執(zhí)行:
加密命令:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input='root' password=PEB123@321BEP algorithm=PBEWithMD5AndDES
解密命令:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input='密文內(nèi)容' password=PEB123@321BEP algorithm=PBEWithMD5AndDES
方案三:通過 Maven 插件加密
pom 中添加插件:
<plugin> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-maven-plugin</artifactId> <version>3.0.4</version> </plugin>
執(zhí)行加密:
mvn jasypt:encrypt-value -Djasypt.encryptor.password="PEB123@321BEP" -Djasypt.plugin.value="需要加密的內(nèi)容"
啟動(dòng)參數(shù)設(shè)置秘鑰,確保安全
秘鑰不應(yīng)硬編碼或保存在配置文件中,應(yīng)通過以下方式傳遞:
- 作為 Java 啟動(dòng)參數(shù):
java -jar app.jar --jasypt.encryptor.password=PEB123@321BEP
- 或作為 JVM 參數(shù):
java -Djasypt.encryptor.password=PEB123@321BEP -jar app.jar
避免秘鑰暴露才是真正保障系統(tǒng)安全的關(guān)鍵。
常見問題及解決策略
算法兼容性引發(fā)的啟動(dòng)錯(cuò)誤
Jasypt 3.x 版本默認(rèn)加密算法為 PBEWITHHMACSHA512ANDAES_256,此算法要求 JDK 9+ 或安裝 JCE 無限制策略文件支持,低版本 JDK 或未安裝會(huì)導(dǎo)致綁定參數(shù)失敗。
解決方案:
- 降低算法版本,切換為
PBEWithMD5AndDES - 指定無 IV 生成器:
jasypt:
encryptor:
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
- 或者降級(jí) Jasypt 版本到 2.x
如何保證秘鑰安全
- 切勿將秘鑰以明文形式存儲(chǔ)在代碼或配置中
- 通過外部傳參方式加載秘鑰
- 如有更高安全需求,可自定義加密器邏輯或結(jié)合硬件安全模塊(HSM)
防止敏感信息誤上傳 Git 的多重手段
- 規(guī)范代碼提交流程和權(quán)限控制,減少因誤操作泄露風(fēng)險(xiǎn)
- 使用
.gitignore文件忽略敏感配置文件,避免被跟蹤提交 - 利用敏感信息檢測(cè)工具(如
git-secrets)對(duì)提交進(jìn)行掃描,阻止敏感數(shù)據(jù)提交 - 嚴(yán)格 Code Review 流程,團(tuán)隊(duì)互相監(jiān)督發(fā)現(xiàn)潛在風(fēng)險(xiǎn)
這些手段結(jié)合加密技術(shù),形成信息安全多道防線。
技術(shù)與法律的思考:代碼歸屬權(quán)問題
近期發(fā)生的 Nginx 創(chuàng)始人被其前東家質(zhì)疑代碼歸屬事件,激發(fā)行業(yè)對(duì)程序員勞動(dòng)成果歸屬的廣泛討論:
- 通常在職期間的開發(fā)屬于公司資產(chǎn)
- 但開源精神與個(gè)人貢獻(xiàn)之間需達(dá)成平衡與共識(shí)
- 合同、企業(yè)制度、法律法規(guī)均需明確界定權(quán)責(zé)
這一復(fù)雜議題值得團(tuán)隊(duì)和企業(yè)深入思考,既要尊重知識(shí)產(chǎn)權(quán),也要保護(hù)開發(fā)者權(quán)益。
結(jié)語
安全不僅是一段代碼的加密,更是技術(shù)人員責(zé)任心的體現(xiàn)。Jasypt 為 Spring Boot 項(xiàng)目提供了簡單易用的敏感信息加密方案,配合完善的秘鑰管理和流程管控,可大幅提升系統(tǒng)安全等級(jí)。作為開發(fā)者,應(yīng)始終將安全納入日常開發(fā)習(xí)慣,筑牢業(yè)務(wù)護(hù)城河,防止數(shù)據(jù)泄露風(fēng)險(xiǎn)。
以上就是SpringBoot集成Jasypt實(shí)現(xiàn)敏感信息加密保護(hù)功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Jasypt敏感信息加密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot導(dǎo)入導(dǎo)出數(shù)據(jù)實(shí)現(xiàn)方法詳解
這篇文章主要介紹了SpringBoot導(dǎo)入導(dǎo)出數(shù)據(jù)實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
解決Spring JPA 使用@transaction注解時(shí)產(chǎn)生CGLIB代理沖突問題
這篇文章主要介紹了解決Spring JPA 使用@transaction注解時(shí)產(chǎn)生CGLIB代理沖突問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringCloud Nacos配置中心管理超詳細(xì)講解
這篇文章主要介紹了Springcloud中的Nacos服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
springboot集成gzip和zip數(shù)據(jù)壓縮傳輸(適用大數(shù)據(jù)信息傳輸)
?在大數(shù)據(jù)量的傳輸中,壓縮數(shù)據(jù)后進(jìn)行傳輸可以一定程度的解決速度問題,本文主要介紹了springboot集成gzip和zip數(shù)據(jù)壓縮傳輸,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

