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

【SpringBoot】SpringBoot整合jasypt进行重要数据加密

  📝个人主页:哈__

期待您的关注 

目录

📕jasypt简介 

 🔥SpringBoot使用jasypt

📂创建我需要的数据库文件

 📕引入依赖

🔓配置数据库文件(先不进行加密)

🌙创建mapper接口

🔒配置文件加密 

一、通过测试获取加密后的数据

 二、通过build插件


📕jasypt简介 

Jasypt(Java Simplified Encryption)是一个专注于简化Java加密操作的开源工具。它提供了一种简单而强大的方式来处理数据的加密和解密,使开发者能够轻松地保护应用程序中的敏感信息,如数据库密码、API密钥等。


Jasypt的设计理念是简化加密操作,使其对开发者更加友好。它采用密码学强度的加密算法,支持多种加密算法,从而平衡了性能和安全性。其中,Jasypt的核心思想之一是基于密码的加密(Password Based Encryption,PBE),通过用户提供的密码生成加密密钥,然后使用该密钥对数据进行加密和解密。此外,Jasypt还引入了盐(Salt)的概念,通过添加随机生成的盐值,提高了加密的安全性,防止相同的原始数据在不同的加密过程中产生相同的结果,有效抵御彩虹表攻击。


Jasypt的功能非常丰富,包括加密属性文件、Spring Framework集成、加密Hibernate数据源配置、URL加密的Apache Wicket集成等。它还可以与Acegi Security(即Spring Security)整合,用于加密任务与应用程序,如加密密码、敏感信息和数据通信,以及创建完整检查数据的sums等。此外,Jasypt还提供了一个开放的API,使得任何Java Cryptography Extension都可以使用它。


在Spring Boot应用中,Jasypt Spring Boot Starter是一个方便的集成工具,可以简化加密功能的配置。它支持多种加密算法,包括对称加密和非对称加密,可以根据实际需求选择合适的加密方式。通过使用Jasypt Spring Boot Starter,可以轻松地将加密功能集成到Spring Boot应用中,无需手动配置复杂的加密相关的代码和配置文件。

⭐jasypt的优点

  • 提供简单的单向(摘要)和双向加密技术。
  • 用于任何JCE提供程序的开放API,而不仅仅是默认的Java VM提供程序。
  • 为您的用户密码提供更高的安全性。
  • 二进制加密支持。Jasypt允许对二进制文件(字节数组)进行摘要和加密。
  • 数值加密支持。除了文本和二进制文件,它还允许对数值进行摘要和加密(BigInteger和BigDecimal,加密Hibernate持久性时支持其他数字类型)。
  • 完全线程安全。
  • 支持加密/摘要池,以在多处理器/多核系统中实现高性能。
  • 包括库的轻量级(“精简”)版本,以便在移动平台等大小受限的环境中具有更好的可管理性。

🔥SpringBoot使用jasypt

📂创建我需要的数据库文件

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (`s_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',`s_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',`s_birth` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',`s_sex` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',PRIMARY KEY (`s_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('01', '赵雷', '1990-01-01', '男');
INSERT INTO `student` VALUES ('02', '钱电', '1990-12-21', '男');
INSERT INTO `student` VALUES ('03', '孙风', '1990-05-20', '男');
INSERT INTO `student` VALUES ('04', '李云', '1990-08-06', '男');
INSERT INTO `student` VALUES ('05', '周梅', '1991-12-01', '女');
INSERT INTO `student` VALUES ('06', '吴兰', '1992-03-01', '女');
INSERT INTO `student` VALUES ('07', '郑竹', '1989-07-01', '女');
INSERT INTO `student` VALUES ('08', '王菊', '1990-01-20', '女');SET FOREIGN_KEY_CHECKS = 1;

 📕引入依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.5</version></dependency><!--  引入核心依赖      --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency>

🔓配置数据库文件(先不进行加密)

spring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=falsedriver-class-name: com.mysql.jdbc.Driverusername: rootpassword: 2020

🌙创建mapper接口

这里使用的是MybatisPlus,如果不会使用,可以看我另一篇文章【Spring】SpringBoot整合MybatisPlus的基本应用_简单的springboot+mybatisplus的应用程序-CSDN博客

@Mapper
public interface StudentMapper extends BaseMapper<Student> {
}

加下来进行进行测试。直接调用了mapper的selectList方法。

    @ResourceStudentMapper studentMapper;@Testvoid findStudent(){List<Student> students = studentMapper.selectList(null);students.forEach(System.out::println);}


结果也没问题。但我们这样把数据库密码暴露出来难免是不安全的,别人以看你的配置文件就知道你的数据库密码,如果是你本地环境也就算了,但如果是你的服务器环境,一旦被别人知道了你的密码就糟糕了,所以接下来采用加密的方式展示配置文件中的一些内容。

🔒配置文件加密 

引入依赖

jasypt:encryptor:#  采用的加密算法algorithm: PBEWITHHMACSHA512ANDAES_256# 盐粒password: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92property:prefix: ENC(suffix: )iv-generator-classname: org.jasypt.iv.RandomIvGenerator

把上方的依赖引入之后,我们就可以使用jasypt去进行加密了。我在这里介绍两种方式。

一、通过测试获取加密后的数据

    @ResourceStringEncryptor stringEncryptor;@Testvoid contextLoads() {String url = stringEncryptor.encrypt("jdbc:mysql://localhost:3306/test");String username = stringEncryptor.encrypt("root");String password = stringEncryptor.encrypt("2020");System.out.println("url="+url);System.out.println("username="+username);System.out.println("password="+password);}

加密后的数据我们已经能够看到了,我现在把这些数据替换到我的application配置文件中。

spring:datasource:url: ENC(avXTcfv9THzOKeuZ0uo38uc+5+K1W/8YHL2Iarf0R308uIsr2x3rRwXWmEDUQvxIFn25IQjCpzHQaZ9+pwg0qOcBi+NaiF1AAVi8W9actPo=)driver-class-name: com.mysql.jdbc.Driverusername: ENC(1u9zbtQFYbb6EiNNQrl1bfGiQ2LfuhDsQ8RPFbZSBTsetSbVmJi4jRDbTKwE8NQv)password: ENC(eG38KVuezyPxMq1kcX/eZuXZZbWKYdSY0ITlZdXCh0CXnnfH5ktdWAqiqOSmaeqB)

 现在调用刚才测试mapper接口的方法看看结果。

还是正确的,如果你不相信,可以调用下边的代码来看看,你的加密数据解密后是不是你真正的数据。方法内的参数需要你自己填写,就是你刚才生成的那些加密的数据。我就不在这里演示了。

        String url = stringEncryptor.decrypt("...");String username = stringEncryptor.decrypt("...");String password = stringEncryptor.decrypt("...");System.out.println("url="+url);System.out.println("username="+username);System.out.println("password="+password);

 二、通过build插件

上方给出的方法,虽然我们将数据加密了,但是作为核心的“盐粒”我们却暴露了出来,如果我们不想将“盐粒”暴露呢?那么在你的pom文件中添加下边的代码。


    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-maven-plugin</artifactId><version>3.0.3</version><configuration><path>file:src/main/resources/application.yml</path></configuration></plugin></plugins></build>

修改配置文件。

 
spring:datasource:url: DEC(jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false)driver-class-name: com.mysql.jdbc.Driverusername: DEC(root)password: DEC(2020)
jasypt:encryptor:algorithm: PBEWITHHMACSHA512ANDAES_256property:prefix: ENC(suffix: )iv-generator-classname: org.jasypt.iv.RandomIvGenerator

运行下方指令。后边的那一串就是你要是用的密钥,我是生成出来的。

mvn jasypt:encrypt -Djasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

之后再次点击你的配置文件查看。原始的数据已经被加密了,并且这个加密的“盐粒”只有你知道。


 那么接下来在调用mapper测试接口试试?这里会报红,因为你的配置文件是加密过的,你怎么可能直接去使用一个加密过的数据呢?你必须要先解密,但是你并没有在配置文件当中提供这个“盐粒”,所以你要通过其他的方式把这个“盐粒”添加进去。


 为了方便展示,我在这里创建一个controller,调用的是studentServiceImpl,之后在调用studentMapper。因为项目要打包,所以只能这样展示,通过前端来展示数据。

引入web依赖。

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

在StudentController中添加方法。

@RestController
@RequestMapping("/student")
public class StudentController {@Resourceprivate StudentService studentService;@RequestMapping("/find-student")public String findStudent(){return  studentService.list().toString();}
}

把项目打包。


之后在target目录下找到我们打包好的项目,打开cmd窗口运行下方指令。(盐粒要改成你自己的)

java -jar 你自己起的包名.jar --jasypt.encryptor.password=8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 

 访问网址查看,数据正确,解密成功。

 

 

相关文章:

【SpringBoot】SpringBoot整合jasypt进行重要数据加密

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4d5;jasypt简介 &#x1f525;SpringBoot使用jasypt &#x1f4c2;创建我需要的数据库文件 &#x1f4d5;引入依赖 &#x1f513;配置数据库文件&#xff08;先不进行加密&#xff09; &#x1f319;创…...

【Go语言入门学习笔记】Part1.梦开始的地方

一、前言 经过一系列的学习&#xff0c;终于有时间来学习一些新的语言&#xff0c;Go语言在现在还是比较时髦的&#xff0c;多一个技能总比不多的好&#xff0c;故有时间来学一下。 二、配置环境 按照网络中已有的配置方法配置好&#xff0c;本人采用了Jetbrain的Goland&#…...

数据特征降维 | 主成分分析(PCA)附Python代码

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维技术和探索性数据分析方法,用于从高维数据中提取出最重要的特征并进行可视化。 PCA的基本思想是通过线性变换将原始数据投影到新的坐标系上,使得投影后的数据具有最大的方差。这些新的坐标轴称为主成分…...

当服务实例出现故障时,Nacos如何处理?

当服务实例出现故障时&#xff0c;Nacos的应对策略 在微服务架构日益盛行的今天&#xff0c;服务之间的稳定性与可靠性成为了我们架构师们不得不面对的重要课题。尤其是在面对服务实例出现故障时&#xff0c;如何确保整个系统的稳定运行&#xff0c;成为了我们首要考虑的问题。…...

遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录 TIF图像转JPGTIF标签转PNG图像重叠裁剪图像重命名数据集转COCO格式数据集转VOC格式 遥感图像不同于一般的自然图像&#xff0c;由于波段数量、图像位深度等原因&#xff0c;TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例&#xff0c;制作能够直接用…...

根据web访问日志,封禁请求量异常的IP,如IP在半小 时后恢复正常则解除封禁

在网络安全日益受到重视的今天&#xff0c;如何有效防范恶意流量和攻击成为了每个网站管理员必须面对的问题。恶意流量不仅会影响网站的正常运行&#xff0c;还可能导致服务器崩溃&#xff0c;给网站带来不可估量的损失。为了应对这一问题&#xff0c;我们特别推出了一款实用的…...

2.go语言初始(二)

本篇博客涉及到go 的基础数据类型、 go 语言中的运算符、转义字符、格式化输出、字符串操作 go 语言中的运算符 在 go 语言中&#xff0c;基本数据类型主要包括以下几类&#xff1a;整数类型、浮点数类型、复数类型、布尔类型、字符串类型、字节类型&#xff08;byte&#xf…...

MQTT对比HTTP

吞吐量&#xff1a;根据3G网络的测量结果&#xff0c;MQTT的吞吐量比HTTP快93倍。这意味着在相同的网络条件下&#xff0c;MQTT能够更有效地传输数据&#xff0c;从而在处理大量数据或实时数据传输时具有更高的效率。架构与模式&#xff1a;MQTT基于发布/订阅模型&#xff0c;提…...

暴力数据结构之二叉树(堆的相关知识)

1. 堆的基本了解 堆&#xff08;heap&#xff09;是计算机科学中一种特殊的数据结构&#xff0c;通常被视为一个完全二叉树&#xff0c;并且可以用数组来存储。堆的主要应用是在一组变化频繁&#xff08;增删查改的频率较高&#xff09;的数据集中查找最值。堆分为大根堆和小根…...

死锁调试技巧:工作线程和用户界面线程

有人碰到了一个死锁问题&#xff0c;找到我们想请我们看看&#xff0c;这个是关于应用程序用户界面相关的死锁问题。 我也不清楚他为什么会找上我们&#xff0c;可能是因为我们经常会和窗口管理器打交道吧。 下面&#xff0c;我们来看看死锁的两个线程。 >> 请移步至 …...

蓝桥杯-外卖店优先级(简单写法)

“饱了么”外卖系统中维护着 N 家外卖店&#xff0c;编号 1∼N。 每家外卖店都有一个优先级&#xff0c;初始时 (0 时刻) 优先级都为 0。 每经过 1 个时间单位&#xff0c;如果外卖店没有订单&#xff0c;则优先级会减少 1&#xff0c;最低减到 0&#xff1b;而如果外卖店有订…...

VueRouter使用总结

VueRouter 是 Vue.js 的官方路由管理器&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;。在使用 VueRouter 时&#xff0c;开发者可以定义路由映射规则&#xff0c;并在 Vue 组件中通过编程式导航或声明式导航的方式控制页面的跳转和展示。以下是 VueRouter 使用的…...

Flink checkpoint 源码分析- Checkpoint snapshot 处理流程

背景 在上一篇博客中我们分析了代码中barrier的是如何流动传递的。Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析-CSDN博客 最后跟踪到了代码org.apache.flink.streaming.runtime.io.checkpointing.CheckpointedInputGate#handleEvent 现在我们接着跟踪相应…...

Leaflet.canvaslabel在Ajax异步请求时bindPopup无效的解决办法

目录 前言 一、场景重现 1、遇到问题的代码 2、问题排查 二、通过实验验证猜想 1、排查LayerGroup和FeatureGroup 2、排查Leaflet.canvaslabel.js 三、柳暗花明又一村 1、点聚类的办法 2、歪打正着 总结 前言 在上一篇博客中介绍了基于SpringBoot的全国风景区WebGIS按…...

Go 处理错误

如果你习惯了 try catch 这样的语法后&#xff0c;会觉得处理错误真简单&#xff0c;然后你再来接触 Go 的错误异常&#xff0c;你会发现他好复杂啊&#xff0c;怎么到处都是 error&#xff0c;到处都需要处理 error。 首先咱们需要知道 Go 语言里面有个约定&#xff0c;就是一…...

python读取excel数据写入mysql

概述 业务中有时会需要解析excel中的数据&#xff0c;按照要求处理后&#xff0c;写入到db中&#xff1b; 用python处理这个正好简便快捷 demo 没有依赖就 pip install pymysql一下 import pymysql from pymysql.converters import escape_string from openpyxl import loa…...

flutter日期选择器仅选择年、月

引入包&#xff1a;flutter_datetime_picker: 1.5.0 封装 import package:flutter/cupertino.dart; import package:flutter/material.dart; import package:flutter_datetime_picker/flutter_datetime_picker.dart;class ATuiDateTimePicker {static Future<DateTime> …...

素数筛详解c++

一、埃式筛法 代码 二、线性筛法&#xff08;欧拉筛法&#xff09; 主要的思想就是一个质数的倍数(倍数为1除外)肯定是合数&#xff0c;那么我们利用这个质数算出合数&#xff0c;然后划掉这个合数&#xff0c;下次就可以不用判断它是不是质数&#xff0c;节省了大量的时间。 …...

【Python超详细的学习笔记】Python超详细的学习笔记,涉及多个领域,是个很不错的笔记

获取笔记链接 Python超详细的学习笔记 一&#xff0c;逆向加密模块 1&#xff0c;Python中运行JS代码 1.1 解决中文乱码或者报错问题 import subprocess from functools import partial subprocess.Popen partial(subprocess.Popen, encodingutf-8) import execjs1.2 常用…...

TINA 使用教程

常用功能 分析-电气规则检查&#xff1a;短路&#xff0c;断路等分析- 直流分析 交流分析 瞬态分析 视图-分离曲线 由于输出的容性负载导致的振荡 增加5欧电阻后OK 横扫参数 添加横扫曲线的电阻&#xff0c;选择R3&#xff1a;8K-20K PWL和WAV文件的支持 示例一&#xff1a;…...

C++ STL set与multiset容器:红黑树实现、核心操作与性能优化指南

1. 容器概览&#xff1a;为什么我们需要 set 和 multiset&#xff1f;在C的日常开发里&#xff0c;尤其是处理需要快速查找、去重或排序的数据集合时&#xff0c;std::set和std::multiset这两个关联容器出场率极高。很多刚从顺序容器&#xff08;如vector、list&#xff09;转过…...

【硬件实战】从栅极驱动芯片到H桥:MOS管驱动电路设计精要

1. 栅极驱动芯片选型与核心参数解析 第一次用IR2104做H桥驱动时&#xff0c;我犯了个低级错误——没仔细看芯片的驱动能力参数&#xff0c;结果MOS管开关速度慢得像老牛拉车&#xff0c;电机发热严重。这个教训让我明白&#xff0c;选对栅极驱动芯片是H桥设计的首要任务。 目前…...

宝塔面板如何定期清理日志垃圾_设置计划任务自动清理.txt

...

嵌入式系统学习路径:从硬件基础到系统架构的认知跃迁

1. 从“螺丝钉”到“系统设计师”&#xff1a;嵌入式学习的认知跃迁大家好&#xff0c;我是老张&#xff0c;一个在嵌入式行业里摸爬滚打了十几年的老兵。今天我们不聊具体的代码&#xff0c;也不讲某个芯片的寄存器配置&#xff0c;我想和大家聊聊一个更根本的问题&#xff1a…...

批量处理二维码图片,真的需要联网吗?这款离线高效工具给你答案!

批量处理二维码图片&#xff0c;真的需要联网吗&#xff1f;这款离线高效工具给你答案&#xff01; 【免费下载链接】QrScan 离线批量检测图片是否包含二维码以及识别二维码 项目地址: https://gitcode.com/gh_mirrors/qrs/QrScan 想象一下这个场景&#xff1a;公司市场…...

【c++面向对象编程】第30篇:RAII与智能指针(一):auto_ptr的缺陷与unique_ptr

目录 一、一个手动管理的痛点 二、RAII 核心思想 三、auto_ptr&#xff1a;C98 的尝试与缺陷 auto_ptr 的核心缺陷 四、unique_ptr&#xff1a;真正的独占式智能指针 基本用法 常用成员函数 五、unique_ptr 与数组 六、自定义删除器 七、make_unique&#xff08;C14&a…...

面试题详解:提示词工程 Prompt Engineering 全攻略——大模型提示词、RAG Prompt、Agent Prompt、Tool Calling、结构化输出与安全防护一次讲透

1. 什么是提示词工程&#xff1f;1.1 提示词不是“咒语”&#xff0c;而是模型的工作说明书提示词工程&#xff0c;通俗地说&#xff0c;就是把你想让大模型完成的任务&#xff0c;用模型更容易理解、更容易执行、更容易稳定复现的方式写出来。它不是玄学&#xff0c;也不是简单…...

酒吧数字化方案:Java德州扑克小酒馆扫码点餐预约系统源码

在消费升级与数字化转型的大背景下&#xff0c;中小型德州扑克小酒馆的运营模式正逐步从“人工主导”向“数字化赋能”转变。不同于传统酒吧&#xff0c;德州扑克小酒馆以“休闲娱乐餐饮服务”为核心&#xff0c;其运营痛点集中在点餐效率低、预约管理乱、桌台调度难、合规管控…...

Nacos高可用集群部署实战:从架构设计到生产运维全解析

1. 项目概述&#xff1a;为什么Nacos集群部署是微服务架构的“定海神针”在微服务架构的实践中&#xff0c;服务注册与发现、配置管理是两大基石。Nacos作为Spring Cloud Alibaba生态的核心组件&#xff0c;集这两大功能于一身&#xff0c;其稳定性和可用性直接决定了整个微服务…...

国产碳化硅MOSFET在通讯电源PFC中的应用与实战解析

1. 项目概述&#xff1a;当通讯电源遇上国产碳化硅MOSFET最近在做一个通讯电源的PFC&#xff08;功率因数校正&#xff09;项目&#xff0c;客户对效率、功率密度和可靠性提出了近乎苛刻的要求。传统的硅基MOSFET方案&#xff0c;在追求更高开关频率以减小磁性元件体积时&#…...