Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker+Git+Maven的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

  • 1、前言
  • 2、什么是Jasypt
  • 3、什么是Jasypt-Spring-Boot
  • 4、接入初体验
    • 4.1 yml配置方式
    • 4.2 自定义配置类方式
    • 4.3 开始测试
    • 4.4 修改mysql参数加密
  • 5、使用JVM启动参数设置密钥
  • 6、加密和解密数据库字段
  • 7、结语

1、前言

在我们日常开发中,很多时候为了保证数据的安全,在处理敏感数据前后端数据传输数据库敏感数据入库等,数据的加密和解密是不可忽视的重要环节,特别是一些政企项目这点就尤为重要,避免每一次安全审计后反复的调整,所以在系统设计之初我们就应当把数据安全的问题考虑进去!

今天博主就给大家详细介绍Jasypt-Spring-Boot的功能,并展示如何在Spring Boot项目中实现各种加解密操作

2、什么是Jasypt

Jasypt(Java Simplified Encryption)是一个用于加密和解密数据的Java库。它提供了简单易用的API,可以轻松地将加密功能集成到Java应用程序中。Jasypt支持多种加密算法,并且可以保护各种类型的数据,包括文本、配置文件和数据库字段等。

3、什么是Jasypt-Spring-Boot

Jasypt-Spring-Boot是一个用于在Spring Boot应用程序中集成Jasypt的Starter。通过使用Jasypt-Spring-Boot,我们可以轻松地在Spring Boot项目中配置和使用Jasypt的加解密功能。
目前该库已经有2.8K的Star,且目前最新版本是 3.0.5
在这里插入图片描述

GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot

4、接入初体验

在开始接入前首先构建我们的 Spring Boot 项目, 引入相关依赖

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>

4.1 yml配置方式

修改 Spring Boot 配置文件,增加密钥

jasypt:encryptor:password: 123456

Spring Boot 启动类上 或配置类Configuration类上追加 @EnableEncryptableProperties注解

具体参数说明可以查看以下表格

配置项必填默认值说明
jasypt.encryptor.password设置密钥
jasypt.encryptor.algorithmPBEWITHHMACSHA512ANDAES_256设置算法
jasypt.encryptor.key-obtention-iterations1000设置密钥生成的迭代次数
jasypt.encryptor.pool-size1设置加密池的大小
jasypt.encryptor.provider-nameSunJCE设置加密提供者名称
jasypt.encryptor.provider-class-namenull设置加密提供类名
jasypt.encryptor.salt-generator-classnameorg.jasypt.salt.RandomSaltGenerator设置盐值生成器的类名
jasypt.encryptor.iv-generator-classnameorg.jasypt.iv.RandomIvGenerator设置初始化向量生成器的类名
jasypt.encryptor.string-output-typebase64设置输出字符串的编码方式
jasypt.encryptor.proxy-property-sourcesfalse
jasypt.encryptor.skip-property-sourcesempty list

最后一个属性jasypt.encryptor.proxy-property-sources用于指示jasyp-spring-boot如何拦截属性值以进行解密

  • 默认值false使用PropertySourceEnumerablePropertySourceMapPropertySource的自定义包装器实现。
  • 当为该属性指定true时,拦截机制将在每个特定的PropertySource实现上使用CGLib代理。这在某些必须保留原始PropertySource类型的场景中可能很有用

4.2 自定义配置类方式

创建一个自定义配置类:Bean名称为: jasyptStringEncryptor

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
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;@Configuration
@EnableEncryptableProperties
public class StringEncryptorConfig {@Bean("jasyptStringEncryptor")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.RandomIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

温馨提示

  • 在自定义StringEncryptor的时候,会覆盖默认的加密器,且Bean名称固定为 jasyptStringEncryptor
  • 如果你需要自定义Bean名称,则需要在springboot配置文件追加
    jasypt.encryptor.bean = your encryptorBean Name

如下面自定义自定义Bean名称

    @Bean("encryptorBean")public StringEncryptor stringEncryptor() {//参考上面的配置参数...}

4.3 开始测试

我们现在来编写一个测试类,来体验加解密的效果

	@Resource(name = "jasyptStringEncryptor")private StringEncryptor stringEncryptor;@Testpublic void testJasypt() {String mysqlRoot = stringEncryptor.encrypt("root");String mysqlPassword = stringEncryptor.encrypt("123456");System.out.println("mysqlroot加密后:"+mysqlRoot);System.out.println("mysqlPassword加密后:"+mysqlPassword);System.out.println("===================");System.out.println("mysqlRoot解密后:"+ stringEncryptor.decrypt(mysqlRoot));System.out.println("mysqlPassword解密后:"+ stringEncryptor.decrypt(mysqlPassword));}

测试输出如下:
在这里插入图片描述

4.4 修改mysql参数加密

我们已经获得了mysql加密后的账号以及密码,现在我们来给mysql配置的明文账户密码改一下

加密格式:默认的前后缀是 ENC() 括号里是密文

# 数据源配置
spring:#数据源配置datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8# 未加密前#username: root#password: 123456# 加密后username: ENC(TBTl1fiJ7tilJ91sEdym6G8vEQG7Wn3QhIBU77mrfzCtqkHPMEMAihvpjokqUgMP)password: ENC(9galEBTwYzgGG6ER3oY+k45463tkvYSnt+epH8SE/hldbi13hg3+XL7CPKpgJAQp)

启动SpringBoot项目。观察控制台输出,数据库是否完成连接初始化,且项目启动成功!

在这里插入图片描述

特别说明
小伙伴发现了在mysql的配置中,我们使用 ENC() 来包裹我们的密文,这个前后缀是可以修改的,如MICRO()

修改配置文件方式

jasypt:encryptor:property:prefix: "MICRO["suffix: "]"

编码方式

我们可以通过创建一个名为 encryptablePropertyDetector 类型为 EncryptablePropertyDetector 的Bean来覆盖默认实现,如果你需要修改默认名称,需要覆盖属性 jasypt.encryptor.property.detector-bean 并指定您希望给予bean的名称

private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {@Overridepublic boolean isEncrypted(String value) {if (value != null) {return value.startsWith("MICRO");}return false;}@Overridepublic String unwrapEncryptedValue(String value) {return value.substring("MICRO".length());}
}
@Bean(name = "encryptablePropertyDetector")public EncryptablePropertyDetector encryptablePropertyDetector() {return new MyEncryptablePropertyDetector();}

5、使用JVM启动参数设置密钥

在我们 YML 配置方式中, jasypt.encryptor.password=123456 是明文的,有小伙伴会问,哎呀这不也是暴露了加密密钥么? 要解决这个问题,我们可以使用JVM启动参数设置

在IDEA项目里 ,点击 Edit Configurations ,添加 VM 启动参数 -Djasypt.encryptor.password=123456
在这里插入图片描述
在这里插入图片描述
在生产环境部署jar包的时候,可以使用如下命令启动:

java -jar your-project.jar --jasypt.encryptor.password=password

6、加密和解密数据库字段

在我们公司某些项目中,用户的敏感信息是不允许明文存储数据库的,比如手机号、身份证等,接下来我们来演示如何在实体类中使用Jasypt进行数据库字段实现加解密

注意引入JPA支持 spring-boot-starter-data-jpa

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import org.jasypt.util.text.AES256TextEncryptor;@Component
@Converter
public class EncryptedStringConverter implements AttributeConverter<String, String> {@Resource(name = "jasyptStringEncryptor")private StringEncryptor stringEncryptor;@Overridepublic String convertToDatabaseColumn(String attribute) {return stringEncryptor.encrypt(attribute);}@Overridepublic String convertToEntityAttribute(String dbData) {return stringEncryptor.decrypt(dbData);}
}

然后在实体类中使用这个转换器

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Convert(converter = EncryptedStringConverter.class)@Column(name = "password")private String password;// Getters and Setters
}

7、结语

Jasypt-Spring-Boot是一个强大且易于使用的工具,可以在Spring Boot应用程序中实现加密和解密操作。通过本文的介绍,我们了解了如何在Spring Boot项目中配置和使用Jasypt,并展示了各种加解密操作的实现方法。

下一篇我们将针对Jasypt整合升级一下,使用自定义注解和AOP实现敏感数据加解密,点点关注更新不迷路哦~


在这里插入图片描述

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

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

相关文章

【全开源】Shopro社区团购(小程序版)

邻里间的购物新选择 基于Fastadmin后端管理系统Uniapp客户端&#xff08;仅支持微信小程序&#xff09;开发&#xff0c;生鲜果蔬社区团购的不二之选、快速搭建社区团购平台、让你的产品走进上千个社区。线上团购线下自提&#xff0c;玩转社区消费新模式提供专业、优质的社区团…

如何解决chatgpt出现503 bad gateway的问题

昨日&#xff0c;ChatGPT官网挂了&#xff0c;也就是使用web网页端访问的用户&#xff0c;会出现 bad gateway 情况。我们去ChatGPT官方的监控查看&#xff0c;已经展示相关错误。 影响的范围有&#xff1a; 影响了 ChatGPT 所有计划的所有用户。影响包括所有与 ChatGPT 相关…

实验四、零比特插入《计算机网络》

但凡这句话有一点用的话也不至于一点用都没有。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握零比特插入原理及方法使用任意编程语言实现零比特插入方法。 二、实验内容 掌握零比特插入原理及方法 点对点协议 PPP&#xff08;Point-to-Point Protoco…

计算机三级等级考试

计算机等级考试&#xff1a; 一&#xff1a;理论知识考试 100分考60分 1&#xff1a;题库 二&#xff1a;技能考试 100分考60分 1&#xff1a;写文档 项目概述 功能描述 数据库设计 UML 绘 图 用例图 与 包图&#xff08;两个图&#xff09; 2&…

网络运维简介

目录 1.网络运维的定义 2.诞生背景 3.网络运维的重要性 4.优点 5.缺点 6.应用场景 6.1.十个应用场景 6.2.数据中心运维 7.应用实例 8.小结 1.网络运维的定义 网络运维&#xff08;Network Operations&#xff09;是指管理、监控和维护计算机网络以确保其高效、安全和…

校园安保巡逻机器人

2023年8月5日&#xff0c;陕西西安一高校实验室起火冒烟&#xff0c;导致学校化学实验室发生火灾。2022年8月3日&#xff0c;一名歹徒持械闯入江西吉安安福县城的一家私立幼儿园&#xff0c;对着无辜的幼儿行凶伤人&#xff0c;造成3死6伤。 像这样的事故有不断地发生&#xf…

2024首发!会声会影2024旗舰版,专业编辑新体验!

会声会影2024最新旗舰版是一款专业的视频编辑软件&#xff0c;它集成了多种高级功能&#xff0c;为用户带来极致的视频编辑体验。在这篇文章中&#xff0c;我们将详细介绍该软件的功能和特色&#xff0c;帮助用户更好地了解和使用它。 会声会影全版本绿色安装包获取链接&#…

【云岚家政】-day00-开发环境配置

文章目录 1 开发工具版本2 IDEA环境配置2.1 编码配置2.2 自动导包设置2.3 提示忽略大小写2.4 设置 Java 编译级别 3 Maven环境3.1 安装Maven3.2 配置仓库3.3 IDEA中配置maven 4 配置虚拟机4.1 导入虚拟机4.2 问题 5 配置数据库环境5.1 启动mysql容器5.2 使用MySQL客户端连接数据…

【Python数据类型的奥秘】:构建程序基石,驾驭信息之海

文章目录 &#x1f680;Python数据类型&#x1f308;1. 基本概念⭐2. 转化&#x1f44a;3. 数值运算&#x1f4a5;4. 数值运算扩展(math库常用函数) &#x1f680;Python数据类型 &#x1f308;1. 基本概念 整数&#xff08;int&#xff09;&#xff1a;整数是没有小数部分的数…

深入分析 Flink SQL 工作机制

摘要&#xff1a;本文整理自 Flink Forward 2020 全球在线会议中文精华版&#xff0c;由 Apache Flink PMC 伍翀&#xff08;云邪&#xff09;分享&#xff0c;社区志愿者陈婧敏&#xff08;清樾&#xff09;整理。旨在帮助大家更好地理解 Flink SQL 引擎的工作原理。文章主要分…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…

SpringBoot+Redis发送短信

SpringBootRedis发送短信 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId&g…

[数据集][目标检测]盲道检测数据集VOC+YOLO格式2173张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2173 标注数量(xml文件个数)&#xff1a;2173 标注数量(txt文件个数)&#xff1a;2173 标注…

Spring Boot项目中,如何在yml配置文件中读取maven pom.xml文件中的properties标签下的属性值

一、前言 在最近的项目开发过程中&#xff0c;有一个需求&#xff0c;需要在Spring Boot项目的yml配置文件中读取到mave的 pom.xml文件中的properties标签下的属性值&#xff0c;这个要怎么实现呢&#xff1f; 二、技术实践 pom.xml文件中增加测试属性 <properties><…

【Flask开发实战】首页模板

一、前言 前面我们已经完成登录页面的设定&#xff0c;登录后临时调转到“hello flask”的界面。现在我们根据实际首页的设计需要&#xff0c;来完成首页相关内容的开发。一般系统首页会放一些分析数据&#xff0c;多以图表的方式展示&#xff0c;方便使用者了解信息。以防火墙…

第三方软件测试报告模版分享

第三方软件测试报告是由独立的第三方机构进行的软件测试后所生成的详细报告。它包含了软件测试的各个方面&#xff0c;包括功能测试、性能测试、安全测试等。通过第三方的客观评估&#xff0c;该报告能够全面、准确地反映出软件的优点与缺陷&#xff0c;为软件开发商和用户提供…

【C语言之排序】-------六大排序

作者主页&#xff1a;作者主页 数据结构专栏&#xff1a;数据结构 创作时间 &#xff1a;2024年5月18日 前言&#xff1a; 今天我们就给大家带来几种排序的讲解&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;希尔排序&#xff0c;选择排序&#xff0c;堆排序&…

【Qt秘籍】[002]-开始你的Qt之旅-下载

一、Qt的开发工具有哪些&#xff1f; Qt的开发工具概述Qt支持多种开发工具&#xff0c;其中最常见的开发工具是 1.QtCreator 【易上手/有少量bug/适合新手】 2.VisualStudio 【功能强大/易出错/需要更多额外配置】 3.Eclipse 【清朝老兵IDE/不建议使用】 【注意&#xff1…

在 Win系统安装 Ubuntu20.04子系统 WSL2 (默认是C盘,第7步开始迁移到D盘,也可以不迁移)

1、简介 WSL在Windows 10上原生运行Linux二进制可执行文件&#xff0c;不用单独安装虚拟机。 WSL2是WSL的第二个版本&#xff0c;提供了与WSL相比的显著性能改进和完全的系统呼叫兼容性。通过运行Linux内核在一个轻量级虚拟机&#xff08;VM&#xff09;中实现。 2、安装 电…

上位机图像处理和嵌入式模块部署(f407 mcu中的udp server开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 既然lwip已经port到407上面了&#xff0c;接下来其实就可以做一些测试了。本身lwip支持tcp、udp&#xff0c;也支持client和server&#xff0c;既然…