首页 > 其他分享 >如何基于Security框架兼容多套用户密码加密方式

如何基于Security框架兼容多套用户密码加密方式

时间:2023-03-20 09:00:22浏览次数:45  
标签:encodingId encoders 加密 兼容 密码 put new Security

mark

一、说明

当已上线的系统存在使用其他的加密方式加密的密码数据,并且密码 不可逆 时,而新的数据采用了其他的加密方式,则需要同时兼容多种加密方式的密码校验。

例如下列几种情况:

  1. 旧系统用户的密码采用了 MD5 的加密方式,而升级框架后的新系统则采用 BCrypt 的加密方式;
  2. 当割接历史数据后会存在用户表中密码的 加密方式不统一 的问题,历史数据为 MD5 新数据为 BCrypt
  3. 所以需要系统支持同时兼容多种加密方式的密码校验。

本文分享基于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

如下图所示:

file

3条记录中,前两条为原有的历史记录使用的是 MD5 的加密算法,然后新插入的数据使用的为 bcrypt 的加密算法,分别使用不同的前缀标识 encodingId

 

3.2. 配置 PasswordEncoder 对象

使用 DelegatingPasswordEncoder 类来定义 PasswordEncoder 并且指定默认加密方式为 bcrypt

@Bean
public PasswordEncoder passwordEncoder() {
   return PwdEncoderUtil.getDelegatingPasswordEncoder("bcrypt");
}

以下两种情况下都是使用默认的加密方式:

  1. 使用 encode 方法加密数据。
  2. 使用 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

 

扫码关注有惊喜!

file

标签:encodingId,encoders,加密,兼容,密码,put,new,Security
From: https://www.cnblogs.com/zlt2000/p/17235125.html

相关文章

  • 【THM】Intro to Defensive Security(防御性安全介绍)-学习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/defensivesecurityhq本文相关内容:介绍防御性安全和相关主题,例如威胁情报、SOC、DFIR和SIEM。防御性安全......
  • 硬件加密狗--软加密狗(软锁)--云授权的转变
      加密狗,由USB硬件加密狗--软加密狗(软锁)--云授权的转变圣天诺LDK软授权问:什么是软授权?答:软授权(也称软锁)是以计算机文件作为载体的软件许可证(License)类型,而硬授权(也称硬锁......
  • 【Java】Allatori代码加密
    一般来说我们在写Java程序时都会使用Maven(或Gradle)做依赖集成。这过程中Maven(或Gradle)作为编译黑盒,输入源码而输出字节码。但我们也知道Java程序是可以通过反编译工具看到源......
  • 对称加密算法和非对称加密算法
    对称加密对称加密,是指,加密方和解密方使用同样的秘钥来进行加密和解密。在对称加密算法中,数据发信方将明文(原始数据)和加密(密钥)一起经过特殊加密算法处理后,使其变成复杂的......
  • 华为 od 敏感字段加密
    本期题目:敏感字段加密......
  • .net7 AesCng 加密解密封装,仅支持Windows平台
    ///<summary>///AesCng加密///仅支持Windows平台///</summary>///<paramname="value">明文(待加密)</param>......
  • 单片机唯一的特征标识进行加密
    前言​ 之前在开发单片机的嵌入式程序的时候,使用单片机不存在读保护的方法,于是开始思考这个问题,如何对单片机进行芯片加密,由于产品在研发的过程可能需要将产品给客户进......
  • java 加密和json格式化代码 、http url提交
      CloseableHttpClientclient=HttpClients.createDefault();CloseableHttpResponseres=null;JsonObjectjson=null;......
  • spring security
              认证  授权:    ......
  • python之DES3加密
    安装第三方模块pipinstallpycryptodome代码实现importbase64fromCrypto.CipherimportDES3defdes3(data_string):BS=8pad=lambdas:s+(BS......