Springboot采用jasypt加密配置的項目實踐
前言
在以往的多數(shù)項目中,配置文件中的數(shù)據(jù)庫密碼、redis密碼、nacos密碼等敏感性信息一般是以明文形式存在,存在泄露的風(fēng)險,因此,對敏感信息加固是很有必要,加固的一個重要環(huán)節(jié)就是對重要信息做加密處理。
這里簡單的介紹一下Jasypt加密
一、Jasypt簡介
Jasypt 是一個 java 庫,可以使開發(fā)者不需要太多操作來給 Java 項目添加基本加密功能,而且不需要知道加密原理。Jasypt 為開發(fā)人員提供了一種簡單易用加密功能,包括:密碼認(rèn)證、字符串加密等。
二、運用場景
一般來說,項目配置文件里,所有涉及信息安全的配置項(或字段)都應(yīng)該做處理,典型的比如:
- 數(shù)據(jù)庫密碼,如mysql、oracle
- 緩存中間件的密碼,如 redis、mongodb
- 其他中間件,如消息中間件、zk、nacos等
- 第三方服務(wù)的,如appid、 Access_Key
- …
三、整合Jasypt
官方示例:GitHub - ulisesbocchio/jasypt-spring-boot-samples: Sample apps using jasypt-spring-boot
3.1.環(huán)境配置
- ?SpringBoot 2.0以上
- ?Jasypt 3.0.5
- ?jdk1.8
3.2.添加依賴
在項目 pom.xml 添加 Jasypt 相關(guān)依賴。
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
3.3.添加Jasypt配置
jasypt: encryptor: password: 123456 algorithm: PBEWITHHMACSHA512ANDAES_256 iv-generator-classname: org.jasypt.iv.RandomIvGenerator salt-generator-classname: org.jasypt.salt.RandomSaltGenerator string-output-type: base64 provider-name: SunJCE pool-size: 1 key-obtention-iterations: 1000 property: # 標(biāo)識為加密屬性的前綴 prefix: ENC( # 標(biāo)識為加密屬性的后綴 suffix: )
2.4.編寫加/解密工具類
package com.bexk.util; import java.util.Base64; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; /** * @Description: 加解密密算法 * @Author developer * @Date 2024/10/11 9:48 上午 */ public class JasyptUtil { /** * PBE 算法 */ public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES"; public static final String PBE_ALGORITHMS_SHA512_AES_256 = "PBEWithHMACSHA512ANDAES_256"; private JasyptUtil() { } /** * 加密 * * @param encryptedStr 加密字符串 * @param password 鹽值 * @return */ public static String encrypt(String encryptedStr, String password) { return encrypt(encryptedStr, PBE_ALGORITHMS_MD5_DES, password); } /** * 加密 * * @param encryptedStr 加密字符串 * @param algorithm 加密算法 * @param password 鹽值 * @return */ public static String encrypt(String encryptedStr, String algorithm, String password) { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentPBEConfig config = new EnvironmentPBEConfig(); // 指定加密算法 config.setAlgorithm(algorithm); // 加密鹽值 config.setPassword(password); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); encryptor.setConfig(config); // 加密 return encryptor.encrypt(encryptedStr); } /** * 解密 * * @param decryptStr 解密字符串 * @param password 鹽值 * @return */ public static String decrypt(String decryptStr, String password) { return decrypt(decryptStr, PBE_ALGORITHMS_MD5_DES, password); } /** * 解密 * * @param decryptStr 解密字符串 * @param algorithm 指定解密算法 * @param password 鹽值 * @return */ public static String decrypt(String decryptStr, String algorithm, String password) { StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); EnvironmentPBEConfig config = new EnvironmentPBEConfig(); // 指定解密算法:解密算法要與加密算法一一對應(yīng) config.setAlgorithm(algorithm); // 加密秘鑰 config.setPassword(password); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); encryptor.setConfig(config); // 解密 return encryptor.decrypt(decryptStr); } }
修改配置文件
如圖,通過編寫加/解密工具類得到對應(yīng)的加密結(jié)果,然后將配置文件的原始明文密碼替換成上一步對應(yīng)的結(jié)果,并通過 ENC(加密結(jié)果) 包裹起來。
加密前:
加密后:
2.5.自定義加密屬性前綴和后綴
如果您只想為加密屬性使用不同的前綴/后綴,則可以繼續(xù)使用所有默認(rèn)實現(xiàn),只需覆蓋 application.yml (或 application.properties)中的以下屬性(property):
jasypt: encryptor: property: prefix: "ENC@[" suffix: "]"
2.6.防止密碼泄露措施
若使用的是默認(rèn)的加密規(guī)則,會讓當(dāng)自定義加密鹽值(jasypt.encryptor.password) 泄漏,可能變得不安全。那么如何進一步防止密碼泄露呢?
2.61.自定義加密器
自定義加密規(guī)則非常簡單,只需要提供自定義的加密器配置類,然后通過jasypt.encryptor.bean配置指定加密配置類即可。
@Bean(name = "encryptorBean") static public StringEncryptor stringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("password"); config.setAlgorithm("PBEWithHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; }
也將自定義加密器添加到 Spring IoC 容器中。
@Configuration public class JasyptConfig { /** * 加解密鹽值 */ @Value("${jasypt.encryptor.password}") private String password; // @Bean("jasyptStringEncryptor") @Bean("encryptorBean") public StringEncryptor myStringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("password"); config.setAlgorithm("PBEWithHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } }
修改配置文件
jasypt: encryptor: # 指定加解密bean的名稱,默認(rèn)jasyptStringEncryptor bean: encryptorBean # 鹽值 password: 123456 #省略其它
注意事項:Jasypt默認(rèn)加解密器bean的Name為 jasyptStringEncryptor,若不想在配置文件中指定自定義加密器名稱,需將自定義加密器bean的Name設(shè)置為jasyptStringEncryptor,否則將不生效。
Springcloud項目最好不要采用自定義,容易出現(xiàn)找不到bean的問題。
2.6.2通過環(huán)境變量指定加密鹽值
方式一:直接作為程序啟動時的命令行參數(shù)
java -jar test.jar --jasypt.encryptor.password=鹽值
方式二:直接作為程序啟動時的應(yīng)用環(huán)境變量
java -Djasypt.encryptor.password=鹽值 -jar test.jar
如果通過Docker部署,請在ENTRYPOINT加上對應(yīng)參數(shù),比如:
ENTRYPOINT ["java","-Djasypt.encryptor.password=test","-jar","test.jar"]
方式三:直接作為系統(tǒng)環(huán)境變量
1. 設(shè)置系統(tǒng)環(huán)境變量 :JASYPT_PWD
在windows系統(tǒng)設(shè)置:
在eclipse設(shè)置,如圖:
在idea中設(shè)置,需要通過VM options設(shè)置,如圖:
在linux系統(tǒng)設(shè)置
#打開全局配置文件: sudo vim /etc/profile #編輯全局配置文件: export JASYPT_PWD=nrmZtkF7T0kjG #重載profile配置文件: source /etc/profile
2. Spring Boot的項目配置文件指定系統(tǒng)環(huán)境變量:
jasypt: encryptor: password: ${JASYPT_PWD:123456}
總結(jié)
本文介紹了如何在Springboot項目中使用Jasypt對配置文件中的敏感信息進行加密,包括環(huán)境配置、依賴添加、配置設(shè)置、自定義加密器和使用環(huán)境變量管理鹽值,以提升項目的安全性。
到此這篇關(guān)于Springboot采用jasypt加密配置的項目實踐的文章就介紹到這了,更多相關(guān)Springboot jasypt加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Servlet+MyBatis項目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議
今天小編就為大家分享一篇關(guān)于Servlet+MyBatis項目轉(zhuǎn)Spring Cloud微服務(wù),多數(shù)據(jù)源配置修改建議,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理
這篇文章主要介紹了關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理,SpringBoot提供了多種方式來處理異常,在本文中,我們將介紹SpringBoot中的@ExceptionHandler注解,演示如何使用它進行局部異常處理2023-07-07java實現(xiàn)的導(dǎo)出Excel工具類實例
這篇文章主要介紹了java實現(xiàn)的導(dǎo)出Excel工具類,結(jié)合具體實例形式分析了java導(dǎo)出Excel導(dǎo)出并生成Excel表格相關(guān)操作技巧與注意事項,需要的朋友可以參考下2017-10-10