news 2026/4/23 11:33:50

springboot集成Jasypt实现配置文件启动时自动解密-ENC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
springboot集成Jasypt实现配置文件启动时自动解密-ENC

SpringBoot本身并没有自动加解密的功能,平时项目启动时,自动解密配置文件里ENC( )包含的数据,原因是使用了Jasypt(Java Simplified Encryption)。

一、前置条件,maven引入依赖

<!-- Spring Boot集成Jasypt核心依赖 --> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.5</version> <!-- 适配Spring Boot版本 --> </dependency>

二、配置文件中设置密码和算法

要想SpringBoot在启动的时候,自动创建加解密的Bean对象,必须同时满足两个条件

一个是引入集成的依赖,【jasypt-spring-boot-starter】

另一个就是配置文件里必须指定密码【jasypt.encryptor.password】

jasypt: encryptor: # 加密/解密的密码(生产环境需安全存储,可以配置在环境变量里) # 这里的密码用来生成符合指定算法的标准密钥(比如AES256需要32位长度的密钥,AES128需要16位长度的密钥) password: UmrPassword1234 # 指定加密算法 (默认是PBEWITHHMACSHA512ANDAES_256),jdk8有些小版本有可能不支持,所以降级,方便测试 algorithm: PBEWITHHMACSHA512ANDAES_128 # 默认配置,会调这两个生成随机的偏移量(iv)和盐值(salt) # iv-generator-classname: org.jasypt.iv.RandomIvGenerator # salt-generator-classname: org.jasypt.salt.RandomSaltGenerator

相关源码【JasyptEncryptorConfigurationProperties】

三、测试加解密

import org.jasypt.encryption.StringEncryptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; @RestController public class DemoController { @Autowired private StringEncryptor jasyptStringEncryptor; @PostConstruct public void init() { String str = "admin123456Oracle"; String encrypt = jasyptStringEncryptor.encrypt(str); System.out.println("加密之后的密文:"+ encrypt); String decrypt = jasyptStringEncryptor.decrypt(encrypt); System.out.println("解密之后的明文:"+decrypt); } }

运行结果

四、配置文件设置 ENC(密文)

把之前得到的加密串,用 ENC(密文) 的格式放到配置文件中

运行结果

五、疑问

既然每次 偏移量IV 是通过RandomIvGenerator随机生成的,那加解密的时候如何保证是同一个IV和Salt?

Jasypt 不会让 IV 和密文分离,会把 IV 放入最终的加密字符串,而解密的第一步就是拆分加密字符串,拿到 准确的IV 和 Salt,再利用 IV 和 Salt,对加密串进行解密。

这样做,即便是相同的明文数据,因为IV随机生成,最终生成的加密串也会不同。

具体源码在StandardPBEByteEncryptor

Salt的目的是在于结合用户密码(jasypt.encryptor.password),进行一些操作之后,生成一个标准的密钥。因为AES对称加密算法,需要一个标准密钥(AES256需要的密钥长度是32位,AES128需要的密钥长度是16位),配置文件配的用户密码(jasypt.encryptor.password)肯定是随意写的,不符合要求。

六、使用Jasypt工具类进行解密

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; public class JasyptUtil { private static final String secretKey = "UmrPassword1234"; private static final String algorithm = "PBEWITHHMACSHA512ANDAES_128"; public static void main(String[] args) { String encrypt = "Fnk4mSyyaLvL5iQPPRRzwcz44zS7aXFsGC3BA0lWsH3fY4nCd89+fYaLsjfK3JsfoIFNXGTHPmjbRQwsPsIiuA=="; StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); //加密算法 config.setAlgorithm(algorithm); // 指定IV生成器 config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); // 指定SALT生成器 config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); encryptor.setConfig(config); //设置加密的密钥,一般是放在配置文件里 encryptor.setPassword(secretKey); try{ String decrypt = encryptor.decrypt(encrypt); System.out.println("解密的明文:" + decrypt); }catch (Exception e){ e.printStackTrace(); } } }

运行结果如下

如果把 生成IV的给注释掉,就会出现以下错误,提示IV长度不够,因为加解密的时候,一个用了RandomSaltGenerator,一个没用,就会出现以下错误。

七、源码解析

SpringBoot在项目启动的时候,会调用EncryptablePropertyResolver去判断,是否包含ENC,如果包含 "ENC(密文) ",就会自动进行解密

isEncryted方法满足了,才会走到这里面,说明需要解密

isEncrypted方法会判断前缀是否包含"ENC(",后缀是否包含")"

具体加解密类,【StandardPBEStringEncryptor】

八、注意事项,启动的时候出现乱码问题

如果启动的时候,解密出来是乱码的。

可能是以下情况:

①工具类和Springboot启动后使用的加解密算法不一致

②工具类指定生成偏移量(iv)或盐值(salt)的类,跟SpringBoot启动时指定的不一样

九、扩展

前面提到过,SpringBoot在启动的时候,会自动创建一个名叫jasyptStringEncryptor的bean,因此,我们可以创建一个相同名字的Bean,然后重写它的加解密方法,这样启动的时候,就会调我们自己写的加解密方法,而不是Jasypt里的加解密方法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 8:46:52

SpringBoot+Vue 甘肃非物质文化网站平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 甘肃非物质文化遗产作为中华优秀传统文化的重要组成部分&#xff0c;承载着丰富的历史文化信息和民族智慧。随着信息技术的快速发展&#xff0c;传统的非遗保护方式已难以满足现代社会的需求&#xff0c;数字化保护与传承成为重要趋势。本项目旨在构建一个基于SpringBoot和…

作者头像 李华
网站建设 2026/4/21 22:11:04

基于IWOA-CNN-BiLSTM-Attention多变量时序预测 Matlab代码

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 [独家原创]基于IWOA-CNN-BiLSTM-Attention多变量时序预测 Matlab代码 改进点&#xff1a;三个(附赠参考文献)--------【如需优化算法(IWOA)测试函数&#xff0c;额外加20】 1、准反向学习---来初始化种群 …

作者头像 李华
网站建设 2026/4/22 19:47:39

扔掉 K8s 和 YAML 后,我的团队上线速度快了 10 倍

我一直在思考一个问题&#xff1a;为什么在容器化如此普及的今天&#xff0c;部署应用依然是一件让许多团队头疼的难事&#xff1f;我们用 AI 加速了“写代码”&#xff0c;但工程师大量的时间&#xff0c;却消耗在了写代码之外的、那些看不见的“摩擦”上。我认为&#xff0c;…

作者头像 李华
网站建设 2026/4/23 10:28:02

【2025最新】基于SpringBoot+Vue的网上点餐系统管理系统源码+MyBatis+MySQL

摘要 随着互联网技术的快速发展&#xff0c;餐饮行业逐步向数字化、智能化方向转型&#xff0c;传统的线下点餐模式已无法满足现代消费者的高效、便捷需求。网上点餐系统的出现不仅优化了餐饮企业的运营效率&#xff0c;还提升了顾客的用餐体验。该系统通过整合线上线下资源&am…

作者头像 李华
网站建设 2026/4/17 8:26:25

小徐影城管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着数字化技术的快速发展&#xff0c;传统影院管理模式已无法满足现代用户的需求。影院管理系统通过信息化手段提升运营效率、优化用户体验成为行业趋势。当前影院管理面临排片混乱、票务统计效率低、会员管理分散等问题&#xff0c;亟需一套高效、稳定且可扩展的管理系统…

作者头像 李华