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里的加解密方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webstrom提交git时总是会自动格式化,导致页面报错Expected no line breaks before closing bracket, but 1 line break found

开发的时候明明都是好的&#xff0c;最后提交的时候因为编辑器的自动格式化&#xff0c;导致页面一堆报错、Expected no line breaks before closing bracket, but 1 line break found 。气死了发现都是某一行的代码写的特别的长&#xff0c;他在提交时自动格式化&#xff0c;换…

SpringBoot+Vue 小徐影城管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着数字化时代的快速发展&#xff0c;影院管理系统的智能化需求日益增长。传统影院管理方式依赖人工操作&#xff0c;效率低下且易出错&#xff0c;难以满足现代影院的高效运营需求。小徐影城管理系统管理平台旨在通过信息化手段解决这一问题&#xff0c;实现影院的自动化…

滤波前后对比图

% 读取数据 pwr freadbkj(../rmli/rmli.ave, 5902, float32, b);% 原始干涉图数据 phase_complex freadbkj(20091226_20100515.diff, 5902, cpxfloat32, b); cc freadbkj(20091226_20100515.cc, 5902, float32, b);% ADF处理后的干涉图数据 adf_phase_complex freadbkj(200…

力扣数据库——第N高的薪水

第N高的薪水https://leetcode.cn/problems/nth-highest-salary/ 一 题目 表: Employee Column NameTypeidintsalaryint id 是该表的主键&#xff08;列中的值互不相同&#xff09;。该表的每一行都包含有关员工工资的信息。编写一个解决方案查询 Employee 表中第 n 高的不…

SpringBoot+Vue 企业客户管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 随着信息技术的快速发展&#xff0c;企业客户管理系统的需求日益增长&#xff0c;传统的人工管理模式已无法满足企业对客户数据的高效管理和分析需求。企业客户管理系统通过信息化手段整合客户资源&#xff0c;优化业务流程&#xff0c;提升客户满意度和企业竞争力。该系统…

人大金仓数据库

v8版本说明 人大金仓数据库V8&#xff08;KingbaseES V8&#xff09;是基于PostgreSQL 9.6版本开发的。‌ 1该版本在设计上继承了PostgreSQL 9.6的特性&#xff0c;同时增加了对Oracle的兼容性支持。 pg9.5以上版本 pg9.5以上版本-PgSQL实现更新或插入&#xff08;单条数据&…

SpringBoot+Vue 网上超市设计与实现管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着互联网技术的快速发展和电子商务的普及&#xff0c;网上超市已成为人们日常生活中不可或缺的一部分。传统的线下超市受限于时间和空间&#xff0c;难以满足消费者多样化的需求&#xff0c;而网上超市凭借其便捷性、高效性和丰富的商品选择&#xff0c;逐渐成为购物主流…

达梦数据库

版本说明 深度mysql

【2025最新】基于SpringBoot+Vue的在线文档管理系统管理系统源码+MyBatis+MySQL

摘要 随着信息技术的飞速发展&#xff0c;企业对文档管理的需求日益增长&#xff0c;传统的文档管理方式已无法满足高效、安全、协同的需求。在线文档管理系统作为一种现代化的解决方案&#xff0c;能够有效解决文档存储、共享、版本控制等问题&#xff0c;提升团队协作效率。该…

SpringBoot+Vue 网上点餐系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着互联网技术的快速发展和移动设备的普及&#xff0c;线上点餐系统逐渐成为餐饮行业数字化转型的重要组成部分。传统的餐饮服务模式存在效率低下、人力成本高、顾客体验差等问题&#xff0c;而网上点餐系统能够有效解决这些问题&#xff0c;提升餐厅运营效率并优化顾客体…

128 自定义滑块

1.自定义滑块 做法&#xff1a;1.先定义好动画&#xff0c;暂停2.使用动画的delay时间&#xff0c;来确定各个时间点位置3.通过input:range来改变delay的css变量值&#xff0c;使用dom.style.setProperty(--delayTime,25s)来设置 <template><!--智能环绕参数面板--&g…

[特殊字符]️_开发效率与运行性能的平衡艺术[20260107170447]

作为一名经历过无数项目开发的工程师&#xff0c;我深知开发效率与运行性能之间的平衡是多么重要。在快节奏的互联网行业&#xff0c;我们既需要快速交付功能&#xff0c;又需要保证系统性能。今天我要分享的是如何在开发效率和运行性能之间找到最佳平衡点的实战经验。 &#…

Agentic AI提示优化案例:提示工程架构师如何用“目标细化”让agents更聚焦?

Agentic AI提示优化实战&#xff1a;用“目标细化”让AI Agents从“摸鱼”到“专注”的秘密 关键词 Agentic AI、提示工程、目标细化、任务分解、LLM Agents、Prompt Optimization、聚焦性 摘要 你有没有遇到过这样的AI Agent&#xff1f;让它“写一篇技术博客”&#xff0…

[特殊字符]️_开发效率与运行性能的平衡艺术[20260107171443]

作为一名经历过无数项目开发的工程师&#xff0c;我深知开发效率与运行性能之间的平衡是多么重要。在快节奏的互联网行业&#xff0c;我们既需要快速交付功能&#xff0c;又需要保证系统性能。今天我要分享的是如何在开发效率和运行性能之间找到最佳平衡点的实战经验。 &#…

3.6-Web后端基础(java操作数据库)

目录 前言 JDBC 介绍 查询数据 需求 准备工作 代码实现 代码剖析 ResultSet 预编译SQL SQL注入 SQL注入解决 性能更高 增删改数据 需求 代码实现 Mybatis 介绍 快速入门 辅助配置 配置SQL提示 配置Mybatis日志输出 JDBC VS Mybatis 数据库连接池 介绍…

[特殊字符]_内存管理深度解析:如何避免GC导致的性能陷阱[20260107172234]

作为一名经历过无数性能调优案例的工程师&#xff0c;我深知内存管理对Web应用性能的影响有多大。在最近的一个项目中&#xff0c;我们遇到了一个棘手的性能问题&#xff1a;系统在高并发下会出现周期性的延迟飙升&#xff0c;经过深入分析&#xff0c;发现问题根源竟然是垃圾回…

我为什么狠狠爱上这些“新 CSS 函数”:它终于开始像个聪明人了

我有一支技术全面、经验丰富的小型团队&#xff0c;专注高效交付中等规模外包项目&#xff0c;有需要外包项目的可以联系我这些年&#xff0c;我眼看着 CSS 一点点变。 有的变化小到像“换了个标点”&#xff0c;你用不用都无所谓&#xff1b;也有的变化大到能改写你整套写法。…

告别 Discuz!:我用这个 14.9k Star 的开源项目,3分钟搭了个“小红书”风格的论坛

想为自己的产品或者兴趣小组建一个交流社区&#xff0c;但一看现在主流的论坛软件&#xff0c;要么像 Discuz! 那样界面老旧&#xff0c;要么像 WordPress 插件那样臃肿笨重。我真的只是想要一个简洁、现代、专注于讨论的论坛而已。直到我发现了 Flarum&#xff0c;一个在 Git…

iOS 26.3 公测版来了:苹果的“假期惊喜”更新,表面小,暗地里很狠

我有一支技术全面、经验丰富的小型团队&#xff0c;专注高效交付中等规模外包项目&#xff0c;有需要外包项目的可以联系我时间来到 12 月中旬。大多数人不是在盘算假期购物&#xff0c;就是终于准备从工作里喘口气。按惯例&#xff0c;苹果这个时候通常很安静——然而最近&…

c++ 17的std::variant对标c#的哪个类型

C# 的 System.Object、dynamic 和 C# 7.0 引入的 System.ValueTuple 以及 System.OneOf 等都可以实现类似功能&#xff0c;但最接近 C std::variant 语义的是&#xff1a;1. 官方方案&#xff1a;System.Object 和模式匹配&#xff08;最接近&#xff09;基础用法csharp// 类似…