Springboot采用jasypt加密配置的項目實踐
前言
在以往的多數(shù)項目中,配置文件中的數(shù)據(jù)庫密碼、redis密碼、nacos密碼等敏感性信息一般是以明文形式存在,存在泄露的風(fēng)險,因此,對敏感信息加固是很有必要,加固的一個重要環(huán)節(jié)就是對重要信息做加密處理。
這里簡單的介紹一下Jasypt加密
一、Jasypt簡介
Jasypt 是一個 java 庫,可以使開發(fā)者不需要太多操作來給 Java 項目添加基本加密功能,而且不需要知道加密原理。Jasypt 為開發(fā)人員提供了一種簡單易用加密功能,包括:密碼認(rèn)證、字符串加密等。
二、運(yù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) 泄漏,可能變得不安全。那么如何進(jìn)一步防止密碼泄露呢?
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對配置文件中的敏感信息進(jìn)行加密,包括環(huán)境配置、依賴添加、配置設(shè)置、自定義加密器和使用環(huán)境變量管理鹽值,以提升項目的安全性。
到此這篇關(guān)于Springboot采用jasypt加密配置的項目實踐的文章就介紹到這了,更多相關(guān)Springboot jasypt加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot3 使用 jasypt 加密配置文件的使用步驟
- JAVA(SpringBoot)集成Jasypt進(jìn)行加密、解密功能
- SpringBoot整合jasypt加密配置文件敏感信息
- SpringBoot整合jasypt進(jìn)行重要數(shù)據(jù)加密的操作代碼
- SpringBoot整合Jasypt實現(xiàn)配置加密的步驟詳解
- Springboot集成Jasypt實現(xiàn)配置文件加密的方法
- SpringBoot整合jasypt實現(xiàn)敏感信息的加密詳解
- SpringBoot集成Jasypt敏感信息加密的操作方法
- Jasypt對SpringBoot配置文件加密
相關(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注解,演示如何使用它進(jìn)行局部異常處理2023-07-07
java實現(xiàn)的導(dǎo)出Excel工具類實例
這篇文章主要介紹了java實現(xiàn)的導(dǎo)出Excel工具類,結(jié)合具體實例形式分析了java導(dǎo)出Excel導(dǎo)出并生成Excel表格相關(guān)操作技巧與注意事項,需要的朋友可以參考下2017-10-10

