如何基于Security框架兼容多套用户密码加密方式
2023/3/20 23:21:59
本文主要是介绍如何基于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. 参考代码
https://gitee.com/zlt2000/microservices-platform/blob/master/zlt-commons/zlt-common-core/src/main/java/com/central/common/utils/PwdEncoderUtil.java
这篇关于如何基于Security框架兼容多套用户密码加密方式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-26高性能表格工具VTable总体构成-icode9专业技术文章分享
- 2024-04-16软路由代理问题, tg 无法代理问题-icode9专业技术文章分享
- 2024-04-16程序猿用什么锅-icode9专业技术文章分享
- 2024-04-16自建 NAS 的方案-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数, 加上remote_src: yes 配置-icode9专业技术文章分享
- 2024-04-14ansible 检测远程主机的8080端口,如果关闭,则echo 进程已关闭-icode9专业技术文章分享
- 2024-04-14result 成功怎么写-icode9专业技术文章分享
- 2024-04-14stopped 状态设置为变量,由外部传递进来-icode9专业技术文章分享
- 2024-04-14为什么ansible执行远程脚本需要放到后台-icode9专业技术文章分享