一、说明

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

例如下列几种情况:

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

本文分享基于Security的PasswordEncoder来实现兼容多套用户密码加密方式。

二、DelegatingPasswordEncoder

在 spring Security 5.0之后,默认的密码加密方案其实是 DelegatingPasswordEncoder 它是一个代理类,而并非一种全新的密码加密方案,可以用来代理多种不同的密码加密方案。

代码参考

  1. Map<String, PasswordEncoder> encoders = new HashMap<>();
  2. encoders.put("bcrypt", new BCryptPasswordEncoder());
  3. encoders.put("ldap", new org.springframework.security.crypto.password.LdapShaPasswordEncoder());
  4. encoders.put("MD4", new org.springframework.security.crypto.password.Md4PasswordEncoder());
  5. encoders.put("MD5", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("MD5"));
  6. encoders.put("noop", org.springframework.security.crypto.password.NoOpPasswordEncoder.getInstance());
  7. encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
  8. encoders.put("scrypt", new SCryptPasswordEncoder());
  9. encoders.put("SHA-1", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-1"));
  10. encoders.put("SHA-256", new org.springframework.security.crypto.password.MessageDigestPasswordEncoder("SHA-256"));
  11. encoders.put("sha256", new org.springframework.security.crypto.password.StandardPasswordEncoder());
  12. encoders.put("argon2", new Argon2PasswordEncoder());
  13. encoders.put("SM3", new SM3PasswordEncoder());
  14. Assert.isTrue(encoders.containsKey(encodingId), encodingId + " is not found in idToPasswordEncoder");
  15. DelegatingPasswordEncoder delegatingPasswordEncoder = new DelegatingPasswordEncoder(encodingId, encoders);
  16. delegatingPasswordEncoder.setDefaultPasswordEncoderForMatches(encoders.get(encodingId));
  17. return delegatingPasswordEncoder;

自动会根据数据的 encodingId 来使用对应的编译器处理密码

三、如何使用

3.1. 修改历史密码数据

修改旧的密码数据的值,添加前缀标识 encodingId 格式如下:

  • 无盐值
  1. {encodingId}密码
  2. 例如源密码为:$2a$10$EgTOU7PMe.3jaMwFsumdweJcnY3TsTqyuJEdSaSKxdgwYchAwUJ1C
  3. 则修改为:
  4. {bcrypt}$2a$10$EgTOU7PMe.3jaMwFsumdweJcnY3TsTqyuJEdSaSKxdgwYchAwUJ1C
  • 有盐值
  1. {encodingId}{salt}密码
  2. 例如源密码为:
  3. 0758f7131c6c95c8e3df05e1ac50214c
  4. 则修改为:
  5. {MD5}{5Hstj}0758f7131c6c95c8e3df05e1ac50214c

encodingId 的值可参考 PwdEncoderUtil

如下图所示:

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

3.2. 配置 PasswordEncoder 对象

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

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

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

  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

扫码关注有惊喜!

如何基于Security框架兼容多套用户密码加密方式的更多相关文章

  1. Cognos权限认证CJP方式之用户密码加密

    在项目开发过程中,用户往往对系统的安全都有明确的要求,下面针对cognos门户认证用户密码如何加密来提供一个简单的wf 1Cognos权限认证方式:CJP 2Cognos用户数据库类型:Oracle ...

  2. c# 对用户密码加密解密

    一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 ? 1 2 3 4 5 6 7 8 9 10 11 12 /// <summary> /// 16位MD5加密 ...

  3. C#:使用MD5对用户密码加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...

  4. 转 C#:使用MD5对用户密码加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...

  5. Maven-009-Nexus 用户密码加密(安全必须)

    信息数据大爆发的时代,我们关心什么?没错,数据安全!数据安全!数据安全!(重要事情说三遍,哈哈哈...) 之前我们存放在 maven settings.xml 文件中的 Nexus 私服用户密码都是明 ...

  6. Spring Security 5.x兼容多种密码加密方式

    1 spring security PasswordEncoder spring security 5不需要配置密码的加密方式,而是用户密码加前缀的方式表明加密方式,如: {MD5}88e2d8cd1 ...

  7. java工具类学习,系统中用户密码加密总结

    现在项目,用户注册登录部分很少有涉及到了,原因:现在热门开发框架都已经在底层帮我们做了一套用户注册,密码加密,登录认证,权限控制,缓存数据等基本功能. 这有利于项目的快速完成,只需要搬砖码畜们专注于业 ...

  8. MD5用户密码加密工具类 MD5Util

    一般记录用户密码,我们都是通过MD5加密配置的形式.这里记录一下,MD5加密的工具类. package com.mms.utils; import java.security.MessageDiges ...

  9. Openfire用户密码加密解密

    需求要求审核过程中都用匿名进行用户注册登录,注册用户审核通过后才使用openfire内置表 如何做到用户密码统一 Openfire是通过org.jivesoftware.util.Blowfish.j ...

  10. 使用bcrypt进行用户密码加密的简单实现

    Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...

随机推荐

  1. java stream map和 flatmap区别

    区别:map mapper返回R,flatMap mapper返回Stream<R> 官网解释 1,<R>Stream<R> flatMap(Function< ...

  2. linux修改网络

    如何修改ip 临时方法: ifconfig DIVICE IP netmask NETMASK 知识临时修改ip,重启或重启网络恢复 在一个网卡上设置多个ip ifconfig DEVICE:NUMB ...

  3. linux资源查看与监控命令

  4. 【redis-cli】常用命令

    -- 查看数据库下key存储数 redis-cli INFO | grep ^db -- 选择数据库 select [0-15] -- 列出所有key keys * -- 列出key模糊匹配 keys ...

  5. webpack1.x 打包文件过大优化

    1. 图片单独打包 module: { loaders: [ { test: /\.(jpe?g|png|gif|svg)$/, loader: 'url?limit=8192&name=./ ...

  6. java pta第三次阶段性总结

    一.前言 这是这学期最后一次总结,这三次的pta大作业也是最后一次,这几次大作业主要写了电信计费系统的主要功能,第一次大作业是座机计费功能,第二次大作业是手机计费功能,第三次大作业是短信计费的功能.这 ...

  7. verilog 硬件描述语言

    第一章 绪论 verilog--数字电路设计技术--ASIC/SOC芯片设计--协议pcie SATA USB--系统知识(个人计算机,芯片组,网络连接,嵌入式系统,硬件和软件的互操作) 第二章 寄存 ...

  8. Alibaba Cloud Linux 3.2104 64位安装php7.2.12

    1 安装php所需要的扩展 yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel curl curl ...

  9. train_data

    for images, labels in train_data: for images, labels in train_data: img = images[0] img = img.numpy( ...

  10. 石子合并问题DP

    START: 2021-08-10 14:29:04 1.问题描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价 ...