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.xdnf.cn/news/1452291.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin 语言基础学习

什么是Kotlin ? Kotiln翻译为中文是:靠他灵。它是由JetBrains 这家公司开发的,JetBrains 是一家编译器软件起家的,例如常用的WebStorm、IntelliJ IDEA等软件。 Kotlin官网 JetBrains 官网 Kotlin 语言目前的现状: 目前Android 已将Kotlin 作为官方开发语言。 Spring 框…

HAL库开发--STM32的HAL环境搭建

知不足而奋进 望远山而前行 目录 文章目录 前言 下载 安装 解压 安装 添加开发包 修改仓库路径 下载软件开发包&#xff08;慢&#xff0c;不推荐&#xff09; 解压已有软件开发包&#xff08;快&#xff0c;推荐&#xff09; 总结 前言 在嵌入式系统开发中&#x…

算法01 递推算法及相关问题详解【C++实现】

目录 递推的概念 训练&#xff1a;斐波那契数列 解析 参考代码 训练&#xff1a;上台阶 参考代码 训练&#xff1a;信封 解析 参考代码 递推的概念 递推是一种处理问题的重要方法。 递推通过对问题的分析&#xff0c;找到问题相邻项之间的关系&#xff08;递推式&a…

Pandas AI:最棒的大模型数据分析神器!

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&…

文生视频新王登场:Luma官宣免费、电影级大片生成,Sora?可灵?SD3.0?(内附网址)

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 文生视频新王登场&#xff1a;Luma官宣免费、电影级大片生成&#xff0c;Sora&#xff1f;可灵&am…

XP系统安装Node.js v8.6.0并搭建Vue2开发环境(项目兼容到Vista的IE9浏览器)

下载并安装Node.js v8.6.0 通常我们开发Vue2项目&#xff0c;是通过vue create命令建立Vue2工程&#xff0c;用npm run serve命令启动Vue2网站的。 vue命令是用JavaScript写的&#xff0c;不是用C语言写的&#xff0c;必须要Node.js环境才能运行&#xff0c;由Node.js自带的np…

0614,表达式,语句

题目一&#xff1a; 许多简单的交互式程序都是基于菜单的&#xff1a;它们向用户显示可供选择的命令列表&#xff1b;一旦用户选择了某条命令&#xff0c;程序就执行相应的操作&#xff0c;然后提示用户输入下一条命令&#xff1b;这个过程一直会持续到用户选择 "退出&qu…

SJ703安全帽防静电测试仪

一、仪器用途 专门检测安全帽防静电性能。 二、仪器特征 1、携带使用轻便、量程宽广、读数准确&#xff0c;耐震性强等卓越优点 2、超上限时显示‘1’提示和低于下限时声响报警。 3、电池欠压时显示欠压符号“←”提示。 4、交流或直流&#xff08;电池&#xff09;供电任…

如何用AI提高产品经理的工作效率

最近我跟几个产品经理聊天&#xff0c;发现有些人居然还没有使用过ChatGPT、MidJourney、NotionAI 等AI工具。 产品经理有个重要的素质是好奇心&#xff0c;好奇心能够帮助产品经理发现新机会、了解用户需求、学习新知识和探索竞争对手&#xff0c;从而更好地完成产品开发和管…

excel中按多列进行匹配并对数量进行累加

公司的生产计划是按订单下发&#xff0c;但不同订单的不同产品中可能有用到相同的配件&#xff0c;按单1对1时&#xff0c;对计算机十分友好&#xff0c;但对于在配件库检料的工人来说就比较麻烦&#xff0c;上百条产品里可能会有多条都是相同的产品&#xff0c;首先考虑的办法…

LeetCode 230.二叉搜索树中第K小的元素

各位看官们&#xff0c;大家好啊&#xff0c;今天这个题我用的方法时间复杂度比较高&#xff0c;但也是便于便于理解的一种方法&#xff0c;大家如果觉得的好的话&#xff0c;就给个免费的赞吧,谢谢大家了^ _ ^ 题目要求如图所示: 题目步骤&#xff1a; 1.我们可以一维数组来接…

软件工程实务:软件产品

目录 1、软件产品的基本概念 2、软件工程是什么&#xff1f; 为什么产生软件工程? 软件工程是做什么的? 3、定制软件和软件产品的工程比较 4 、软件产品的运行模式 5、软件产品开发时需要考虑的两个基本技术因素 6、产品愿景 7、软件产品管理 8、产品原型设计 9、小结…

ROS-SLAM雷达

使用前准备工作 1、新建工作空间、编译功能包 以建立名字为rplidar_ws为例&#xff0c;终端输入 mkdir rplidar_ws cd rplidar_ws mkdir src cd src catkin_init_workspace rplidar_ros功能包&#xff1a;git下载。 https://github.com/Slamtec/rplidar_ros/ 然后把解压的…

用AI造谣每天收入1万元,最后只拘留5日?

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 当时我就震惊了!800多个MCN的自媒体账号每天收入1万元&#xff0c;最后拘留5日?难怪群里这么多人在晒收益截图&#xff0c;原来都是这样来的。 央视刚刚曝光一家MCN机构用AI造谣的事件&#xff0c;该公司用AI一天…

从控制台输入三个数,输出较大的值(Python)

1. 思路 方式1&#xff1a;假设法 eval(字符串)&#xff1a;识别并执行有效的python表达式&#xff0c;识别为元组&#xff0c;拆包赋值给三个变量&#xff0c;假设num1为较大值。 方式2&#xff1a;max()函数 max()&#xff1a;返回多个参数中的最大值。 2. 假设法实现 # 方…

平台型组织的战略及OKR

本文主要探讨了在平台型组织中战略和OKR&#xff08;目标与关键结果&#xff09;的应用&#xff0c;以及如何在不同的组织架构中有效制定和执行战略。原文: Strategy and OKRs in the Platform Organization 战略&#xff1a;重要的承诺、复杂的过程 对于什么是组织的战略&…

救命!挖到宝了,这本计算机书真的巨巨好看

一本适合大学生使用的计算机科学和编程学习指南&#xff0c;它通过丰富的内容和多样的学习形式&#xff0c;帮助学生建立坚实的计算机科学基础&#xff0c;并激发他们对计算机科学的兴趣。 这本书涵盖了多种类型的练习题&#xff0c;旨在帮助读者巩固理论知识并提高实际编程技能…

sprintboot容器功能

容器 容器功能Spring注入组件的注解Component&#xff0c;Controller&#xff0c;Service&#xff0c;Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实例 配置绑定…

TCP相关细节

1. 常用TCP参数 1.1 ReceiveBufferSize ReceiveBuffersize指定了操作系统读缓冲区的大小&#xff0c; 默认值是8192(如图5-10 所示)。在第4章的例子中,会有"假设操作系统缓冲区的长度是8" 这样的描述,可通过socket.ReceiveBufferSize 8 实现。当接收端缓冲区满了的时…