如何基于Security框架兼容多套用户密码加密方式
一、说明
当已上线的系统存在使用其他的加密方式加密的密码数据,并且密码 不可逆 时,而新的数据采用了其他的加密方式,则需要同时兼容多种加密方式的密码校验。
例如下列几种情况:
- 旧系统用户的密码采用了 MD5 的加密方式,而升级框架后的新系统则采用 BCrypt 的加密方式;
- 当割接历史数据后会存在用户表中密码的 加密方式不统一 的问题,历史数据为 MD5 新数据为 BCrypt;
- 所以需要系统支持同时兼容多种加密方式的密码校验。
本文分享基于Security的PasswordEncoder来实现兼容多套用户密码加密方式。
二、DelegatingPasswordEncoder
在 spring Security 5.0之后,默认的密码加密方案其实是 DelegatingPasswordEncoder
它是一个代理类,而并非一种全新的密码加密方案,可以用来代理多种不同的密码加密方案。
代码参考:
Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put("bcrypt", new BCryptPasswordEncoder()); encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder()); encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder()); encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5")); encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance()); encoders.put("pbkdf2", new Pbkdf2PasswordEncoder()); encoders.put("scrypt", new SCryptPasswordEncoder()); encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1")); encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256")); encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder()); encoders.put("argon2", new Argon2PasswordEncoder()); encoders.put("SM3", new SM3PasswordEncoder()); Assert.isTrue(encoders.containsKey(encodingId), encodingId + " is not found in idToPasswordEncoder"); DelegatingPasswordEncoder delegatingPasswordEncoder = new DelegatingPasswordEncoder(encodingId, encoders); delegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(encoders.get(encodingId)); return delegatingPasswordEncoder;
自动会根据数据的
encodingId
来使用对应的编译器处理密码
三、如何使用
3.1. 修改历史密码数据
修改旧的密码数据的值,添加前缀标识 encodingId
格式如下:
- 无盐值
{encodingId}密码 例如源密码为:$2a$10$EgTOU7PMe.3jaMwFsumdweJcnY3TsTqyuJEdSaSKxdgwYchAwUJ1C 则修改为: {bcrypt}$2a$10$EgTOU7PMe.3jaMwFsumdweJcnY3TsTqyuJEdSaSKxdgwYchAwUJ1C
- 有盐值
{encodingId}{salt}密码 例如源密码为: 0758f7131c6c95c8e3df05e1ac50214c 则修改为: {MD5}{5Hstj}0758f7131c6c95c8e3df05e1ac50214c
encodingId 的值可参考
PwdEncoderUtil
类
如下图所示:
3条记录中,前两条为原有的历史记录使用的是
MD5
的加密算法,然后新插入的数据使用的为bcrypt
的加密算法,分别使用不同的前缀标识encodingId
3.2. 配置 PasswordEncoder 对象
使用 DelegatingPasswordEncoder
类来定义 PasswordEncoder
并且指定默认加密方式为 bcrypt
@Bean public PasswordEncoder passwordEncoder() { return PwdEncoderUtil.getDelegatingPasswordEncoder("bcrypt"); }
以下两种情况下都是使用默认的加密方式:
- 使用 encode 方法加密数据。
- 使用 matches 方法对比密文和原文时,密文没有 encodingId 标识。
3.3. 参考代码
扫码关注有惊喜!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
穷人版生产力工具,好用得飞起 「GitHub 热点速览」
被 GPT 和 OpenAI 刷屏了一个多月,现在 GitHub Trending 已经没有什么和 gpt 无关的项目了,但是好在总有优秀的开源项目拯救我的项目疲惫。像是贴心好用的反向代理 pgrok,据说是穷人的 ngrok 替代品;拯救 SQL Boy 的 textSQL,现在你可以不写 SQL 来查数据了。 除此之外,高性能打包工具 rspack 高兴起来,打包的工作分分钟就搞定了,scrcpy 则是名声在外的投屏神器,而 nicegui,Nice!Python 工程师们可以有漂亮的 UI 用了。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 本文目录 1. 本周特推 1.1 反向代理:pgrok 1.2 文本转 SQL:textSQL 2. GitHub Tren...
- 下一篇
OpenHarmony项目实战:基于全志XR806实现的上下位机双OpenHarmony智能门锁样例
本文整理自:https://bbs.aw-ol.com/topic/1108/ 作者 @budbool 一. 简介 本demo是基于Openharmony 3.1 Beta本版开发,不仅可以接收数字管家应用下发的指令来控制门锁开启,而且还可以通过数字管家设置不同的开锁密码以及一次性密码,实现给临时用户一个临时密码,保证门户安全。当然除了开锁的功能,智能门锁还可以通过检测门与门锁距离自动上锁以及如果长时间未上锁,上报告警消息到数字管家,及时提醒用户关门关锁等功能。 1. 交互流程: 如上图所示,智能门锁整体方案原理图可以大致分成:智能门锁设备、数字管家应用、云平台三部分。智能门锁通过MQTT协议连接华为IOT物联网平台,从而实现命令的接收和属性上报。 关于智能设备接入华为云IoT平台的详细细节可以参考 连接IOT云平台指南;智能设备与数字管家应用之间的设备模型定义可以参考profile . 2. 实物简介: 如上图所示,上面是XR806开发板,中间的是hcsr04超声波距离传感器,下面是E53_IA1扩展板。 我们是通过距离传感器感应门的距离,进行自动上锁,也可以在一定时间内无法上锁而产...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器