当前位置: 首页 > news >正文

SpringBoot:配置Jasypt加密yml配置文件属性(本地或Nacos无影响)

前言

  数据安全问题频出,公司开始对数据安全进行严加管控,其中代码开发配置文件中的敏感信息不能明文存放必须密文处理,所以特此记录下Jasypt加解密方式。

imageimage

框架环境

  博主自己框架的版本信息

<!--   SpringBoot版本   -->
<spring-boot.version>3.2.8</spring-boot.version>
<!--   SpringCloud版本   -->
<spring-cloud.version>2023.0.3</spring-cloud.version>
<!--   SpringCloud-Alibaba版本   -->
<spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
<!--   Spring Ai 人工智能框架版本   -->
<spring-ai.version>1.0.0</spring-ai.version>
<!--   bootstrap.yml加载版本   -->
<bootstrap.version>3.1.0</bootstrap.version>

Jasypt依赖

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version> <!-- Spring Boot 2.x:推荐 Jasypt 2.1.x 或 3.0.x。  Spring Boot 3.x:推荐 Jasypt 3.0.5 或更高版本。 -->
</dependency>

重点因为博主框架使用SaToken做鉴权,Gateway内就需要引用SaToken做鉴权过滤,但SaToken需要连接redis,而redis密码使用Jasypt作加密需要解密,最后Gateway(WebFlux)与Jasypt(Servlet)响应式环境冲突,导致启动失败。有相同问题的可以看这篇文章

配置类初始化Jasypt

  网上使用yml配置文件加载Jasypt并通过java -jar命令传递密码的方式较多,博主这里使用的是配置类加载Jasypt,后续使用jar加密后就看不到了,如果使用命令行传递(java -Djasypt.encryptor.password=xxxxxx -jar xxx.jar )并用docker部署的话还是会将密码暴露出来。这里只是多一层考虑,大家根据自己实际情况来评估怎么使用。

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Jasypt配置文件加密密文* @author zy*/
@Configuration
public class JasyptConfig {private static final String password = "JGk3d8r";// 冲突:因Gateway内引用SaToken做鉴权,但SaToken需要连接redis,而redis密码使用Jasypt作加密需要解密,最后Gateway(WebFlux)与Jasypt(Servlet)响应式环境冲突,导致启动失败// 自定义加密器, 封装在代码内,不暴露出去@Bean("jasyptStringEncryptor")public StringEncryptor jasyptStringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 配置文件加密的密码,写死;后续使用jar加密就可以了//config.setPassword(password); // 也可以使用命令行传递密码, java -Djasypt.encryptor.password=mypassword -jar xxxxx.jarconfig.setPassword(System.getProperty("jasypt.encryptor.password"));// 指定加密方式 可以查看JasyptUtil工具类有哪些加密方式config.setAlgorithm(JasyptUtil.PBE_WITHHMACSHA_512_ANDAES_256);// 设置密钥派生过程中的迭代次数。迭代次数越高,暴力破解成本越高// 1000 是较保守的值,现代推荐至少 10,000~100,000(如 Spring Security 默认 PBKDF2 用 185,000)config.setKeyObtentionIterations("100000");// 设置加密器池的大小,"1" 表示只使用一个实例(适用于低并发或单线程场景)config.setPoolSize("1");// 指定 Java 加密服务提供者(Security Provider)。"SunJCE" 是 Oracle JDK 自带的默认加密提供者,支持大多数标准算法config.setProviderName("SunJCE");// 指定盐值(Salt)生成器类// Salt 是随机数据,用于防止彩虹表攻击。每次加密都会生成不同的 salt,即使明文相同,密文也不同。config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");// 设置加密后输出的字符串编码格式config.setStringOutputType("base64");// 不需要 IV 的算法,org.jasypt.iv.NoIvGenerator// 使用 CBC、GCM 等需要 IV 的模式 时(例如 AES/CBC),就必须提供 IV 生成器 org.jasypt.iv.RandomIvGeneratorconfig.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");encryptor.setConfig(config);return encryptor;}}

 Jasypt工具类

   用于生成密文与解密密文的工具类

import com.higentec.common.utils.spring.SpringUtils;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;public class JasyptUtil {/*** PBE 算法*/public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES";public static final String PBE_ALGORITHMS_MD5_TRIPLEDES = "PBEWITHMD5ANDTRIPLEDES";public static final String PBE_ALGORITHMS_SHA1_DESEDE = "PBEWITHSHA1ANDDESEDE";public static final String PBE_ALGORITHMS_SHA1_RC2_40 = "PBEWITHSHA1ANDRC2_40";public static final String PBE_WITHHMACSHA_512_ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";public static final String PBE_WITHHMACSHA_256_ANDAES_256 = "PBEWITHHMACSHA256ANDAES_256";public static final String PBE_WithMD5AndTripleDES = "PBEWithMD5AndTripleDES";public static final String PBE_WithHmacSHA_1_AndAES_128 = "PBEWithHmacSHA1AndAES_128";public static final String PBE_WithHmacSHA_256_AndAES_128 = "PBEWithHmacSHA256AndAES_128";private JasyptUtil() {}/*** Jasypt 加密** @param encryptedStr 加密字符串* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String password) {return encrypt(encryptedStr, PBE_WITHHMACSHA_512_ANDAES_256, password);}/*** Jasypt 加密** @param encryptedStr 加密字符串* @param algorithm    加密算法*                     PBE ALGORITHMS: [PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_40]* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String algorithm, String password) {// StandardPBEStringEncryptor、StandardPBEBigDecimalEncryptor、StandardPBEBigIntegerEncryptor、StandardPBEByteEncryptorStandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定加密方式 可以查看JasyptUtil工具类有哪些加密方式config.setAlgorithm(algorithm);// 配置文件加密的密码config.setPassword(password);// 设置密钥派生过程中的迭代次数。迭代次数越高,暴力破解成本越高// 1000 是较保守的值,现代推荐至少 10,000~100,000(如 Spring Security 默认 PBKDF2 用 185,000)config.setKeyObtentionIterations("100000");// 设置加密器池的大小,"1" 表示只使用一个实例(适用于低并发或单线程场景)config.setPoolSize("1");// 指定 Java 加密服务提供者(Security Provider)。"SunJCE" 是 Oracle JDK 自带的默认加密提供者,支持大多数标准算法config.setProviderName("SunJCE");// 指定盐值(Salt)生成器类// Salt 是随机数据,用于防止彩虹表攻击。每次加密都会生成不同的 salt,即使明文相同,密文也不同。config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");// 不需要 IV 的算法,org.jasypt.iv.NoIvGenerator// 使用 CBC、GCM 等需要 IV 的模式 时(例如 AES/CBC),就必须提供 IV 生成器 org.jasypt.iv.RandomIvGeneratorconfig.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");encryptor.setConfig(config);// 加密return encryptor.encrypt(encryptedStr);}/*** Jasypt 解密** @param decryptStr 解密字符串* @param password   盐值* @return*/public static String decrypt(String decryptStr, String password) {return decrypt(decryptStr, PBE_WITHHMACSHA_512_ANDAES_256, password);}/*** Jasypt 解密** @param decryptStr 解密字符串* @param algorithm  指定解密算法:解密算法要与加密算法一一对应*                   PBE ALGORITHMS: [PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_40]* @param password   盐值* @return*/public static String decrypt(String decryptStr, String algorithm, String password) {// StandardPBEStringEncryptor、StandardPBEBigDecimalEncryptor、StandardPBEBigIntegerEncryptor、StandardPBEByteEncryptorStandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定加密方式 可以查看JasyptUtil工具类有哪些加密方式config.setAlgorithm(algorithm);// 配置文件加密的密码config.setPassword(password);// 设置密钥派生过程中的迭代次数。迭代次数越高,暴力破解成本越高// 1000 是较保守的值,现代推荐至少 10,000~100,000(如 Spring Security 默认 PBKDF2 用 185,000)config.setKeyObtentionIterations("100000");// 设置加密器池的大小,"1" 表示只使用一个实例(适用于低并发或单线程场景)config.setPoolSize("1");// 指定 Java 加密服务提供者(Security Provider)。"SunJCE" 是 Oracle JDK 自带的默认加密提供者,支持大多数标准算法config.setProviderName("SunJCE");// 指定盐值(Salt)生成器类// Salt 是随机数据,用于防止彩虹表攻击。每次加密都会生成不同的 salt,即使明文相同,密文也不同。config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");// 不需要 IV 的算法,org.jasypt.iv.NoIvGenerator// 使用 CBC、GCM 等需要 IV 的模式 时(例如 AES/CBC),就必须提供 IV 生成器 org.jasypt.iv.RandomIvGeneratorconfig.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");encryptor.setConfig(config);// 解密return encryptor.decrypt(decryptStr);}/*** 使用自定义加密器进行加密* @param str 需要进行加密的字符串*/public static String encrypt_customize(String str){StringEncryptor encryptor = SpringUtils.getBean("jasyptStringEncryptor", StringEncryptor.class);return encryptor.encrypt(str);}/*** 使用自定义加密器进行解密* @param str 需要进行解密的密文*/public static String decrypt_customize(String str){StringEncryptor encryptor = SpringUtils.getBean("jasyptStringEncryptor", StringEncryptor.class);return encryptor.decrypt(str);}//    public static void main(String[] args) {
//        String encryptedStr = "12345678ab";
//        String algorithm = PBE_WITHHMACSHA_512_ANDAES_256;
//        String password = "y0BwPTcN";
//        String str = JasyptUtil.encrypt(encryptedStr, algorithm, password);
//        System.out.println("加密后的字符串:" + str);
//        System.out.println("解密后的字符串:" + JasyptUtil.decrypt(str, algorithm, password));
//    }}

 yml配置文件

# Spring
spring:application:# 应用名称name: base-systemprofiles:#环境配置active: @profiles.active@# 冲突:因Gateway内引用SaToken做鉴权,但SaToken需要连接redis,而redis密码使用Jasypt作加密需要解密,最后Gateway(WebFlux)与Jasypt(Servlet)响应式环境冲突,导致启动失败# 手动优先加载 Jasypt 配置文件解密Bean实体cloud:bootstrap:# 多个可以使用,号分隔sources: com.higentec.common.config.JasyptConfig# Jasypt配置文件解密
jasypt:encryptor:# 引用手动优先加载的解密Beanbean: jasyptStringEncryptor

image

重点: 使用加密后的密文需要用 ENC(密文) 包裹起来,如此Jasypt才能识别哪些需要解密。

image

http://www.jsqmd.com/news/311801/

相关文章:

  • 2026汽车增压器零售排行,适配三菱奕歌的优选,久保田增压器/康明斯增压器/威孚增压器,汽车增压器改造推荐排行
  • 从询盘到成交通路图:外贸0-1培训如何帮工厂搭建可复制的成交体系
  • 【2026】 LLM 大模型系统学习指南 (28)
  • 【2026】 LLM 大模型系统学习指南 (29)
  • 【2026】 LLM 大模型系统学习指南 (30)
  • 告别杂乱管理!一站式二手车小程序源码 支持建立完整的品牌-车型库
  • thinkphp3.2.x 代码执行
  • 2026 最新市政管/家装管/PVC管/家装水管品牌TOP5评测!品质铸就口碑,技术引领行业新标准
  • 如何为不同场景选择麻将机?2026年麻将机品牌全面评测与推荐,直击静音与稳定性痛点
  • 2026 最新国内家装水管品牌/厂家TOP5评测!品质标杆+专利技术权威榜单发布,匠心守护家居用水安全
  • GIMP 3.0.8 发布 - 免费开源图像编辑器
  • 麻将机品牌哪个好?2026年麻将机品牌推荐与排名,解决稳定性与静音核心痛点
  • 2026动作捕捉企业精选:哪家口碑佳,服务更胜一筹?激光测距/激光雷达/MEMS惯性传感器,动作捕捉公司口碑推荐
  • 蠕虫病毒,漏洞
  • 2026发际线种植选哪家?国内这几家医院值得参考,发际线种植/美学植发/植发/3D微针植发,发际线种植品牌哪家权威
  • 2026年1月优质之选:头部白介素6试剂盒厂家推荐,vegf elisa试剂盒/鸡试剂盒,白介素6试剂盒源头厂家选哪家
  • 冠洁高压冷水清洗机性价比高不高,和其他品牌对比优势在哪?
  • 2026年1月电动伸缩雨棚/张拉/充电桩/停车棚膜结构厂家推荐:技术迭代期的最优合作伙伴选择指南
  • 高压清洗机防护装备价格多少,沿海城市有哪些高性价比厂商?
  • 细聊华力钢业可以信任吗,全国优质不锈钢带材厂家排名
  • 2026年高性价比的不锈铁卷厂商推荐,费用情况全了解
  • 2026最新PVC管品牌/厂家TOP5评测!专利技术+区域覆盖权威榜单发布,品质管道赋能基建与家居生态
  • 盘点实力强的中央空调品牌,浙江地区口碑好的厂家排名
  • 2026年高端雕塑制造厂商综合实力TOP5推荐:玻璃钢/不锈钢/园林/铸铜/铁艺/石雕选型指南
  • 2026年钉钉服务商联系电话推荐:助您开启数字化协作
  • 2026 国内市政管品牌/厂家TOP5评测!技术创新+品质实证权威榜单发布,构筑城市基础设施安全屏障
  • 分析不锈钢板制造商的价格差异,哪家费用更合理
  • 自适应变分模态轴承故障诊断【附代码】
  • 数据增强多源融合轴承故障诊断【附代码】
  • 地铁自动扶梯智能运维管理平台【附系统】