Spring中加密工具类DigestUtils和BCryptPasswordEncoder

news2025/1/10 12:18:36

spring中的加密工具类DigestUtils

Spring中自带了一个加密工具类,所在的位置的是org.springframework.util.DigestUtils,在spring-core模块中。
该工具类中默认只提供了MD5加密相关的静态方法,同时还有一些获取其他加密算法的私有方法(暗示了我们开发者可以通过继承此工具类,来实现对任意加密算法的实现)

在此工具类的解释中,是这样说的:
“Miscellaneous methods for calculating digests.Mainly for internal use within the framework; consider Apache Commons Codec for a more comprehensive suite of digest utilities.”
意思是说:“这个工具类提供了计算摘要的各种方法。主要用于框架内部使用;如果想要获得更全面的摘要实用程序套件,请考虑Apache Commons Codec。”
也就是说,spring提供这个加密工具类的初衷是供框架内部使用,这个类是在Apache Commons Codec的基础上建立的,所以我们想要更全面的加密工具,还需要访问Apache Commons Codec。(Apache Commons Codec模块提供了对数据进行编码、解码的一系列方法,例如Base64、Hex等)

请注意,现在MD5加密不能保证绝对安全,因此在使用MD5加密时,最后在数据库中维护一个盐值salt,利用此盐值为明文进行加密
MD5本质是基于Hash来做的,是不可逆的

BCryptPasswordEncoder

Spring Security中提供了一个密码加密的工具,org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
采用SHA-256 +随机盐+密钥对密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着可以解密(这个与编码/解码一样),但是采用Hash处理,其过程是不可逆的。

BCryptPasswordEncoder中常用的方法

  • encode(String password)对明文加密,返回生成的密文
  • matches(plainText, encodedText)明文与密文进行比配,返回true或false

我们使用BCryptPasswordEncoder类来加密时,无需在数据库中再维护一个盐值salt
BCryptPasswordEncoder在加密时,会随机生成一个盐值salt

即使相同的明文,两次加密后的结果也是不一样的

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String password = "root";
System.out.println(encoder.encode(password));
System.out.println(encoder.encode(password));

加密结果:

$2a$10$rIWmomm6VnvBFjuOaF1VT.Pje87EsxaMxpFcPn7D1IXWUVBK05ne6
$2a$10$.4HVn5lws4y/BLhFrefYauvSth3REk/yjXjP/TBLnF7l//q3Oz7aO

即使两次的密文是不同的,但是与明文进行匹配时,确实都是可以成功的。

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String password = "root";
String encodedPwd1 = "$2a$10$rIWmomm6VnvBFjuOaF1VT.Pje87EsxaMxpFcPn7D1IXWUVBK05ne6";
String encodePwd2 = "$2a$10$.4HVn5lws4y/BLhFrefYauvSth3REk/yjXjP/TBLnF7l//q3Oz7aO";
System.out.println(encoder.matches("root", encodedPwd1));
System.out.println(encoder.matches("root", encodePwd2));

结果是

true
true

大致的原理就是:虽然两次的密文不同,但是能从密文中获取到使用的盐值salt,重新利用此salt和明文进行加密,得到的结果是否是密文,因此得证:虽然两次密文不同,但是都可以与明文匹配成功。

参考文档

springboot学习——MD5加密
BCryptPasswordEncoder的使用及原理_码农UP2U的博客-CSDN博客

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

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

相关文章

pdf拆分成多个文件的方法以及注意事项

PDF是一种非常流行的文件格式,但有时候我们需要将一个大的PDF文件拆分成多个小的文件,以便于管理和分享。本文将介绍一些拆分PDF文件的方法以及需要注意的事项。 AdobeAcrobat是一款专业的PDF编辑软件,可以轻松地拆分PDF文件。以下是使用Adob…

读取XML的几种方式

一、为什么使用XML 1、便于不同应用程序之间通信。 2、便于不同平台之间通信。 3、便于不同平台之间数据共享。 二、Dom读取 xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <bookstore><book id"1"><name>冰…

Java | 线程的生命周期和安全

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; &#x1f334;线程的生命周期 sleep方法会让线程睡眠&#xff0c;睡眠时间到了之后&#xff0c;立马就会执行下面的代码吗&#xff1f; 答&#xff1a;不会&am…

OSM最新电力数据(2023年9月1日数据)转换总结及与三个月前转换结果对比

sm包含种类繁多&#xff0c;我们这里是只以刚转换的电力设备为例抛砖引玉的进行说明。 首先先看一下转换结果大概368个文件&#xff0c;大约92种类型。当然其中有同一类设备的点、线、面类型&#xff01; 这种带增强的文件&#xff0c;是我在基础规则之外增加的提取规则。是为…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 六)

AppStorage&#xff1a;应用全局的UI状态存储 AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 和LocalStorage不同的是&#xff0c;LocalStorage是页面级的&…

SG-Former实战:使用SG-Former实现图像分类任务(一)

摘要 SG-Former是一种新型的Transformer模型&#xff0c;它被提出以降低视觉Transformer的计算成本&#xff0c;同时保持其优秀的性能表现。计算成本的降低使得SG-Former能够更有效地处理大规模的特征映射&#xff0c;从而提高了模型的效率和全局感知能力。 SG-Former的核心思…

算法综合篇专题三:二分法

"寻一颗&#xff0c;未萌的渺小啊&#xff0c;随着青翠未来&#xff0c;升入辽阔云霄~" 现在你有一个"升序"数组&#xff0c;想让你在这个数组里完成查找数字n&#xff0c;在这个数组内的下标&#xff0c;你可以怎么做&#xff1f;这也许是不少友子们初遇…

内存卡中毒了格式化能解决吗?这样清除病毒更有效

内存卡被广泛应用于手机、相机、MP3等数码产品&#xff0c;并且可以存储各种媒体文件&#xff0c;如视频、图片等。然而&#xff0c;在我们使用过程中&#xff0c;您是否因内存卡格式化而导致重要数据丢失感到困扰。对于“内存卡中毒了格式化能解决吗&#xff1f;“的疑惑&…

用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【LeetCode刷题篇零】一些基础算法知识和前置技能(下)

数组常用技巧 使用数组代替Map 使用另一个数组来统计每个数字出现的次数&#xff0c;数组的下标作为key, 数组的值作为value&#xff0c; 将数字作为数组的下标索引&#xff0c;数组里的值存储该数字出现的次数&#xff0c;原理有点类似桶排序中使用的计数数组。 比如这里如…

tensorboard可视化文件:events.out.tfevents.

跑了一个开源代码&#xff0c;跑完之后看到生成的文件夹里&#xff0c;出现了events.out.thevents.xxx的格式文件&#xff0c;比较好奇&#xff0c;进行了一番学习~   首先说明文件作用&#xff1a;用于tensorboard显示的可视化文件 使用方法 首先要安装tensorboard&#x…

mvn打包:依赖包和启动包分离

简述 依赖插件&#xff1a; maven-jar-plugin maven-assembly-plugin项目目录结构 assembly.xml <assembly xmlns"http://maven.apache.org/ASSEMBLY/2.1.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

zookeeper可视化界面zkui

获取zkui github地址&#xff1a;https://github.com/DeemOpen/zkui 可以使用客户端clone&#xff0c;我这里直接下载zip 解压 编译 如果将包下载到了linux&#xff0c;需要在linux中编译&#xff0c;我的linux没有maven&#xff0c;所以在window编译好&#xff0c;然后复制…

Win10显卡驱动安装失败怎么办

在更新Win10系统的过程中&#xff0c;显卡驱动也要跟着更新&#xff0c;近期有小伙伴反映在安装的过程中显示Win10显卡驱动安装失败&#xff0c;这是怎么回事&#xff0c;遇到这种问题应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下Win10显卡驱动安装失败的解决方法&…

一文说清mmap内存映射底层原理(以LCD中的Framebuffer为例)

一文说清mmap内存映射底层原理 【目录】 一、宏观解释内存映射 二、进程虚拟地址空间 三、虚拟内存区域描述符 四、内存映射的实现 五、mmap在Framebuffer中的应用 前几天的一场面试中&#xff0c;面试官问&#xff1a;为什么可以通过mmap直接操作LCD&#xff1f; 当…

上海亚商投顾:沪指放量反弹 医药、AI概念股集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数早间震荡反弹&#xff0c;午后集体拉升涨超1%&#xff0c;深成指一度涨超1.5%&#xff0c;随后涨幅略…

CSP 202104-1 灰度直方图

答题 就是记录每个数出现的次数&#xff0c;用C的map就行 #include<iostream> #include<map> using namespace std; int main(){map<int,int>h;int n,m,L,a;cin>>n>>m>>L;for(int i0;i<L;i){h[i]0;}while(n--){for(int i0;i<m;i){…

django configparser.NoSectionError: No section: ‘Samples

django configparser.NoSectionError: No section: Samples 背景&#xff1a;Windows下的Django项目&#xff0c;重新部署至Linux ubuntu20中。 samples_white_list eval(config.get(‘Samples’, ‘samples_white_list’)) File “/home/hhl/anaconda3/envs/django/lib/pytho…

Python + Jmeter 实现自动化性能压测

Step01: Python脚本开发 文件路径&#xff1a;D://wl//testproject//Fone-grpc//project1//test_client.py Python 脚本作用&#xff1a; 1.通过 grpc 调用底层 c 的接口&#xff0c;做数据库的数据插入与查询操作&#xff0c;然后将返回的结果进行拼接与输出。 2.代码里面…

optimizer和loss.backward()相关函数

optimizer.zero_grad() # 梯度清零(一定要先进行梯度清零&#xff0c;这样tensor里面的grad就不会累加) loss.backward()是用来求导的 optimizer.step()一般来说根据求来的导数进行梯度下降算法来更新参数 上面的顺序步骤不能变