SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)

1.为什么要有这个需求?

一般当我们自己练习的时候,username和password直接是爆露出来的

假如别人路过你旁边时看到了你的数据库账号密码,他跑到他的电脑打开navicat直接就是一顿连接,直接疯狂删除你的数据库,那可就废了,所以像这种重要的敏感信息,一般是加密过后显示出来的,也就是数据的脱敏,一般公司你看到的数据库连接信息是这样的。

这显然就是加密过后的,但是数据库连接时如果获取到的是你加密过后的密码,那肯定是错误的,所以我们需要在数据库获取到信息之前,把它给解密,切记解密是在获取到数据之前进行的。

2.jasypt是如何保证数据安全的?

可能你会好奇,它既然能解密,那我拿着你的密文去调用jasypt提供的解密方法(api)去解密不就行了吗?但是jasypt可不是这么干的!它提供了一个盐salt,它加密和解密是如下过程进行的。

可以看出没有盐你就算知道密文也没用。也可以说盐就是打开你金库的钥匙。此时你可能会好奇,那密文肯定是代码里面生成的啊,那你生成的时候盐salt和原密码肯定也是写在代码里了,那不也不安全吗?其实这个密文是我们提前通过测试工具类生成好的再放到配置文件中,生成好以后测试工具类就可以直接删除了,所以盐和原密码不会暴漏在代码中,最终只有你知道。

3.SpringBoot项目中如何使用jasypt

3.1引入依赖

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

3.2创建jasypt工具类

主要用于提前进行加密和解密的

package com.fzy.utils;import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;public class JasyptPasswordUtil {private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";/*** 加密* @param salt 你设置加密用的盐* @return 加密类PooledPBEStringEncryptor所需要的配置类*/public static SimpleStringPBEConfig getJasyptConfig(String salt){//加解密配置SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(salt);//配置盐!!!极其重要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");return config;}/*** 加密方法* @param salt 输入盐* @param text 输入需要加密的文本* @return 密文*/public static String encryptText(String salt, String text){PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();//加密类SimpleStringPBEConfig config = getJasyptConfig(salt);//获取并设置加密配置类encryptor.setConfig(config);String encryptText = encryptor.encrypt(text);//进行加密return encryptText;}/*** 解密方法,此处没什么用,就是用来自己看看能不能解密* @param salt 输入盐* @param text 输入需要加密的文本* @return 明文*/public static String  decryptText(String salt, String text){PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = getJasyptConfig(salt);encryptor.setConfig(config);String decryptText = encryptor.decrypt(text);return decryptText;}public static void main(String[] args) {//生成的密文将来放到你yml文件中,例如数据库的用户名密码等敏感信息String encryptText = encryptText("biecaile", "root");System.out.println("加密后:" + encryptText);String decrypt = decryptText("biecaile", encryptText);System.out.println("解密后:" + decrypt);}}

运行后的结果:

稍微了解两个加密算法,PBEWithMD5AndDES和PBEWITHHMACSHA512ANDAES_256
这两个算法跟jasypt的版本有关,如果我们不配置加密算法,无论是3.0还是2.0好像加密都是PBEWithMD5AndDES,但是解密,如果2.0.xxx是使用的PBEWithMD5AndDES,3.0使用的是PBEWITHHMACSHA512ANDAES_256,此处不是指我们自己测试去解密,而是指再配置完yml文件或者程序参数后自己去解密(下面),所以如果解密算法与加密不一致就会报错(一般启动项目就会报错),最好指定加密算法,像我是3.0版指定加密算法为PBEWITHHMACSHA512ANDAES_256
那在yml文件中就不用再配置解密算法了。配一下当然最好。

3.3配置yml文件

jasypt:encryptor:password: biecaile #解密盐值algorithm: PBEWITHHMACSHA512ANDAES_256 #解密算法
test:password: ENC(MsGb7KJD6ZxdEH5O42MM+lDVH6mvtP46IlwVqbXq/CHQR75x2+WG7YyOf3Ootndd)

其中的test:password是我们自定义的,主要用于测试,ENC()这个是jasypt自动识别yml属性值的一个标识,只要加上,当前值就会被解析成明文,里面存放的是我们生成的密文。

3.4编写读取yml文件属性值的配置类TestConfig 

这里主要是为了测试能不能在获取到属性之前,密文已经被解密了,也就是说此处如果正确的话,获取到的就是我们的明文“root”,实际工作根本不需要

package com.fzy.config;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;@Configuration
@Data
public class TestConfig {@Value("${test.password}")private String password;
}

3.5随便编写一个TestController去测试获取该数据

@Controller
@RequestMapping("/test")
public class TestController {@Autowiredprivate TestConfig testConfig;@RequestMapping("/getText")@ResponseBodypublic String getText(){return testConfig.getPassword();}
}

  结果发现获取到的是明文,已经成功了

4.能在配置文件中配盐值salt吗?

肯定是不行的,这样salt直接就爆露出来了,很危险,尤其是放在代码中,也很容易就发现,一般不会写在配置文件中的,我们可以把它放到启动类的程序实参中

填写:--jasypt.encryptor.password=你的盐值salt,然后apply+ok确定就行。

配置完以后把你在配置文件中的password(所谓的salt去掉就行),结果一样的。一般只要salt配的不对,程序启动就会直接报错。

总结:这样的话,就算我把代码给你,你都跑不起来项目,因为你没有salt就配不了,然后你只能去问我要,我就不给你,那么你就破解不了数据库的密文,你就别想连上我的数据库。

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

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

相关文章

字符数组基础知识及题目

死识。。。 字符该如何存储呢&#xff1f;这一点我们在以前就接触过了。用char来存储。 如何输入一个单词呢&#xff1f; char a[10002]; scanf("%s",a); 就不用地址符了。 如何输入句子呢&#xff1f; char a[100002]; gets(a); gets是读入句子的&#xff0c…

【第7章】Vue之第一个Vue程序(Vue创建)

文章目录 前言一、创建1. 命令行2. 创建3. 安装依赖 二、启动三、访问总结 前言 接下来我们通过VSCode来创建我们的第一个Vue应用程序。 一、创建 1. 命令行 Terminal>New Terminal 2. 创建 #这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工…

【Pr剪辑】工具栏的认识

目录 1.选择工具&#xff08;快捷键V&#xff09;1.1 选择1.2 移动素材1.3 框选1.4缩放1.5复制 2.钢笔工具&#xff08;快捷键P&#xff09;3.文字工具&#xff08;T&#xff09;4.剃刀&#xff08;C &#xff09;5.比例拉伸工具&#xff08;R&#xff09;6.波纹编辑工具&#…

HarmongOS打包[保姆级]

创建应用 首先进入 华为开发者联盟-HarmonyOS开发者官网 然后进行登录。 登录成功后&#xff0c;鼠标悬停在在登录右上角那个位置后再点击管理中心&#xff0c;进入下面这个界面。 再点击&#xff1a;应用服务–>应用发布–>新建–>完善信息 构建和生成私钥和证书请求…

惠海 H6213L降压恒压IC 支持3.3V5V12V30V40V60V100V电动车仪表供电稳压芯片方案

H6213L高压降压开关控制器是一款功性能良好的电源管理解决方案。它集成了众多先进的功能&#xff0c;使其在各种高压输入的应用场景中都能表现出色。 首先&#xff0c;H6213L具备高达150V的耐压能力&#xff0c;并支持高达120V的宽压输入范围。这意味着它可以轻松应对各种高压…

云原生系列之Docker常用命令

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 云原生之…

PyTorch计算机视觉入门:从官方数据集到自定义数据集的获取

一、PyTorch与计算机视觉简介 PyTorch是一个开源的深度学习框架&#xff0c;其动态图的特性非常适合快速实验和模型原型设计。在计算机视觉任务中&#xff0c;如图像分类、目标检测、图像分割等&#xff0c;PyTorch提供了丰富的API和预训练模型&#xff0c;帮助开发者快速搭建…

极致深耕,打造核心竞争壁垒——探寻蓝思科技穿越周期的密码

作者 | 曾响铃 文 | 响铃说 一家企业&#xff0c;如何才能在时代变幻的风云中不计较一时得失&#xff0c;长期稳健发展&#xff0c;穿越周期&#xff1f;本期主题就来探寻一家在湖南的国际化企业的发展密码。 穿越周期的企业&#xff0c;都在坚持一个驱动发展的“原点” 细…

scrapy爬取豆瓣书单存入MongoDB数据库

scrapy爬取豆瓣书单存入MongoDB数据库 一、安装scrapy库二、创建scrapy项目三、创建爬虫四、修改settings,设置UA,开启管道五、使用xpath解析数据六、完善items.py七、在douban.py中导入DoubanshudanItem类八、爬取所有页面数据九、管道中存入数据,保存至csv文件十、将数据写…

【Windchill监听器、队列、排程】

目录 Windchill监听器 监听器的概念 监听器的监听器实现原理 监听器的客制化 Windchill队列、排程 队列、排程的概念 Windchill常见出厂队列 自定义队列 Windchill 11新增功能 Windchill监听器 监听器的概念 监听器&#xff0c;字面上的理解就是监听观察某个事件&…

数据结构(DS)学习笔记(二):数据类型与抽象数据类型

参考教材&#xff1a;数据结构C语言版&#xff08;严蔚敏&#xff0c;吴伟民编著&#xff09; 工具&#xff1a;XMind、幕布、公式编译器 正在备考&#xff0c;结合自身空闲时间&#xff0c;不定时更新&#xff0c;会在里面加入一些真题帮助理解数据结构 目录 1.1数据…

FullCalendar日历组件集成实战(15)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

java+vue3+el-tree实现树形结构操作

基于springboot vue3 elementPlus实现树形结构数据的添加、删除和页面展示 效果如下 代码如下&#xff0c;业务部分可以自行修改 java后台代码 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.daztk.mes.common.annotation.LogOperation…

C++ UML建模

starUML UML图转C代码 数据流图 E-R图 流程图 整体架构图 ORM关系图 参考 app.asar附件资源可免激活 JHBlog/设计模式/设计模式/1、StarUML使用简明教程.md at master SunshineBrother/JHBlog GitHub C程序员UML实务手册代码 - 开发实例、源码下载 - 好例子网 GitHub -…

leetcode-09-[232]用栈实现队列[225]用队列实现栈[20]有效的括号[1047]删除字符串中的所有相邻重复项

重点&#xff1a; 栈和队列 Java中 栈不建议用stack来实现 建议用 ArrayDeque和Linkedlist来实现 队列建议用ArrayDeque和Linkedlist来实现 两者效率比较&#xff1a; java - Why is ArrayDeque better than LinkedList - Stack Overflow 基于Linkedlist是链表等&#xff0c;除…

LVGL:

LVGL&#xff08;little video graphics library&#xff09;是一个开源的嵌入式图形库&#xff0c;提供高性能、低资源占用的图形用户界面&#xff08;GUI&#xff09;。具有模块化&#xff08;项目工程源码&#xff09;设计&#xff0c;可以在多平台使用&#xff08;如微处理…

【技术】MySQL 8.4 免安装版配置

MySQL 8.4 免安装版配置 官网下载压缩包解压文件创建配置文件初始化数据库安装MySQL服务链接数据库修改密码 官网下载压缩包 从MySQL官网下载压缩包&#xff0c;官网&#xff1a;https://www.mysql.com/ 头部菜单点击【DOWNLOADS】&#xff0c;跳转到下载页面。在页面底部点击…

苹果电脑装虚拟机和双系统的区别 苹果笔记本虚拟机和双系统哪个好 虚拟机能装MacOS吗 虚拟机类似的软件

Mac电脑用户在需要使用Windows操作系统的软件时&#xff0c;通常会面临两个选择&#xff1a;安装双系统或使用虚拟机。两种方式各有优缺点&#xff0c;适用于不同的使用场景。本文将详细分析和说明Mac电脑装双系统和虚拟机之间的区别&#xff0c;帮助用户选择最适合自己的方案。…

高清无字幕视频素材去哪里找?这几个热门无字幕素材网站你要知道

在短视频创作过程中&#xff0c;高清无字幕的视频素材是提升视频质量的关键。无论是制作校园活动宣传片&#xff0c;还是情感励志视频&#xff0c;这些素材都能让你的视频更具吸引力。今天&#xff0c;我就来给大家推荐几个超棒的视频素材网站&#xff0c;这些网站不仅资源丰富…

Java——面向对象进阶(三)

前言&#xff1a; 抽象类&#xff0c;接口&#xff0c;内部类 文章目录 一、抽象类1.1 抽象方法1.2 抽象类1.3 抽象类的使用 二、 接口2.1 接口的定义和实现2.2 default 关键字2.3 实现接口时遇到的问题 三、内部类3.1 成员内部类3.2 静态内部类3.3 成员内部类3.4 匿名内部类&a…