探索密码校验技术:Spring Security中的多种加密方式

探索密码校验技术:Spring Security中的多种加密方式

在Web应用中,密码的安全存储和验证是至关重要的。本文将通过一个具体的代码示例,介绍和总结如何在Spring Security中使用多种加密方式进行密码校验。我们将重点讲解BCrypt和MD5两种加密方式,以及如何使用代理类来统一管理这些加密方式。

示例代码

以下是我们将分析的核心代码段:

package com.example;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.HashMap;
import java.util.Map;

public class PasswordCheckExample {

  /**
   * 代理类
   */
  private static final PasswordEncoder PASSWORDENCODER;

  static {
    String defaultEncodeId = "bcrypt";
    PasswordEncoder md5 = new DigestMD5PasswordEncoder();

    Map<String, PasswordEncoder> encoders = new HashMap<>();
    encoders.put(defaultEncodeId, new BCryptPasswordEncoder());
    encoders.put("MD5", md5);

    DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(defaultEncodeId, encoders);
    passwordEncoder.setDefaultPasswordEncoderForMatches(md5);

    PASSWORDENCODER = passwordEncoder;
  }

  public static void main(String[] args) {
    // 用户输入的明文密码
    String rawPassword = "123123";

    // 从数据库中读取的已加密的密码
    String encodedPassword = "{bcrypt}$2a$10$S9DHL4DrdO/zhJPM34lm..5CChFbmLThSPdOqweyVh6LLQG73ZeNa"; // 示例密文

    // 验证密码,返回 true 表示匹配,false 表示不匹配
    boolean matches = PASSWORDENCODER.matches(rawPassword, encodedPassword);
    System.out.println("密码匹配结果: " + matches);
  }

  /**
   * PasswordEncoder - MD5
   */
  private static class DigestMD5PasswordEncoder implements PasswordEncoder {

    @Override
    public String encode(CharSequence rawPassword) {
      return DigestUtils.md5Hex((String) rawPassword);
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
      return encodedPassword.equals(encode(rawPassword));
    }
  }
}
主要技术解析
  1. BCryptPasswordEncoder

    • Spring Security 提供的强加密算法。
    • 通过 new BCryptPasswordEncoder() 创建实例,用于密码加密和验证。
    • 优点:安全性高,包含盐值(salt),防止彩虹表攻击。
  2. DigestUtils.md5Hex

    • Apache Commons Codec 提供的MD5加密工具。
    • DigestUtils.md5Hex(String) 用于将明文密码转换为MD5加密后的字符串。
    • 优点:加密速度快;缺点:安全性相对较低,不包含盐值,容易受到彩虹表攻击。
  3. DelegatingPasswordEncoder

    • Spring Security 提供的代理类,用于支持多种密码加密方式。
    • 通过 new DelegatingPasswordEncoder(defaultEncodeId, encoders) 创建实例。
    • 可以设置默认的加密方式以及其他可选的加密方式。
示例代码解析
  1. 定义代理类
    private static final PasswordEncoder PASSWORDENCODER;
    static {
      String defaultEncodeId = "bcrypt";
      PasswordEncoder md5 = new DigestMD5PasswordEncoder();
    
      Map<String, PasswordEncoder> encoders = new HashMap<>();
      encoders.put(defaultEncodeId, new BCryptPasswordEncoder());
      encoders.put("MD5", md5);
    
      DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(defaultEncodeId, encoders);
      passwordEncoder.setDefaultPasswordEncoderForMatches(md5);
    
      PASSWORDENCODER = passwordEncoder;
    }
    
    • 定义一个静态的 PASSWORDENCODER 变量,用于统一管理密码的加密和验证。
    • 创建 BCryptPasswordEncoder 和自定义的 DigestMD5PasswordEncoder 实例。
    • 使用 DelegatingPasswordEncoder 代理类,将上述两种加密方式进行统一管理,并设置默认的加密方式为 BCrypt。
      好的,我们继续。

验证密码

     String encodedPassword = "{bcrypt}$2a$10$S9DHL4DrdO/zhJPM34lm..5CChFbmLThSPdOqweyVh6LLQG73ZeNa"; // 示例密文

     boolean matches = PASSWORDENCODER.matches(rawPassword, encodedPassword);
     System.out.println("密码匹配结果: " + matches);
   }
  • rawPassword 是用户输入的明文密码。
  • encodedPassword 是从数据库中读取的已加密的密码,格式为 {bcrypt}密文,其中 {bcrypt} 标识了使用的是 BCrypt 算法。
  • 使用 PASSWORDENCODER.matches(rawPassword, encodedPassword) 方法来验证用户输入的密码是否与数据库中的加密密码匹配。

自定义MD5加密类

  private static class DigestMD5PasswordEncoder implements PasswordEncoder {

    @Override
    public String encode(CharSequence rawPassword) {
      return DigestUtils.md5Hex((String) rawPassword);
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
      return encodedPassword.equals(encode(rawPassword));
    }
  }
  • 自定义的 DigestMD5PasswordEncoder 实现了 PasswordEncoder 接口。
  • encode 方法用于将明文密码转换为 MD5 加密后的字符串。
  • matches 方法用于验证输入的明文密码是否与加密后的密码匹配。

总结

通过上面的代码示例,我们了解了如何在Spring Security中使用多种加密方式进行密码校验,并且如何通过 DelegatingPasswordEncoder 代理类统一管理这些加密方式。以下是本文总结的主要技术点:

  1. BCryptPasswordEncoder:提供强加密和高安全性的密码加密方式。
  2. DigestUtils.md5Hex:提供快速但相对不安全的MD5加密方式。
  3. DelegatingPasswordEncoder:Spring Security提供的代理类,可以同时支持多种加密方式,并设置默认的加密方式。
  4. 自定义PasswordEncoder:可以根据需要实现自己的密码加密和验证逻辑。

结语

本文通过一个具体的代码示例,详细介绍了如何在Spring Security中实现多种加密方式的密码校验。如果你对密码加密和验证有更多的需求或问题,建议进一步阅读Spring Security的官方文档,或者参考相关的开源项目。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣爆刷第153天之TOP100五连刷26-30(接雨水、环形链表、最长上升子序列)

力扣爆刷第153天之TOP100五连刷26-30&#xff08;接雨水、环形链表、最长上升子序列&#xff09; 文章目录 力扣爆刷第153天之TOP100五连刷26-30&#xff08;接雨水、环形链表、最长上升子序列&#xff09;一、300. 最长递增子序列二、415. 字符串相加三、143. 重排链表四、42.…

docker技术的说明

根据学习网站整理&#xff1a;Docker 10分钟快速入门_哔哩哔哩_bilibili 小白也能看懂的容器科普说明_哔哩哔哩_bilibili 1.虚拟机&#xff0c;需要模拟硬件系统、运行整个操作系统&#xff0c;但体积臃肿&#xff0c;内存占用较高&#xff0c;程序的性能也会受到影响。 2.…

哪里找好用的商城系统源码?

很多企业在挑选商城系统时&#xff0c;由于不懂源码&#xff0c;很难选择到高质量源码的商城系统&#xff0c;那么哪里找好用的商城系统源码?如何选择?接下来就跟着启山智软小编一起来看看吧&#xff0c;以下为选择源码时的四看&#xff1a; 1.一看源码公司行业动态 可以查…

git上传本地项目及更新项目

1、注册GitHub账号和下载git 2、在GitHub上新建一个仓库&#xff0c;点击号——>New repository&#xff0c;给仓库起一个名字&#xff0c;点击Create repository 3、进入要上传的项目中&#xff0c;右键点击git back here&#xff0c;命令行输入git init初始化&#xff0c…

13个行业数据分析指标体系如何建设100问

提供针对13个行业的数据分析指标体系的全面指南&#xff0c;涵盖各行业的关键指标和分析维度&#xff0c;帮助读者深入了解和构建有效的指标体系。以下是文章的主要内容&#xff1a; 电商行业数据指标体系&#xff1a;包括客户价值、商品、网站流量、整体运营、市场营销活动、市…

什么是响应式编程

我们知道&#xff0c;当系统面对大流量、高并发的访问请求时&#xff0c;就可能会出现一系列性能问题&#xff0c;导致服务丧失了即时的响应性。如何时刻确保系统具有应对请求压力的能力&#xff0c;是架构设计的核心问题之一。 经典的服务隔离、限流、降级以及熔断等机制能够在…

基于Istio服务网格的熔断限流实现

在微服务架构的宏大图景中&#xff0c;Istio服务网格如同一位精巧的交通指挥官&#xff0c;它不仅确保了服务间通信的顺畅无阻&#xff0c;还通过先进的熔断与限流机制&#xff0c;为系统的稳定性筑起了一道坚固的防线。接下来&#xff0c;让我们一窥Istio如何在不改动服务代码…

YTM32的flash存储器boot-swap功能详解

YTM32的flash存储器boot-swap功能详解 文章目录 YTM32的flash存储器boot-swap功能详解IntroductionPricinple & MachenisimApplication基本的boot swap用例不更新bootloader的情况更新bootloader的情况 Conclusion Introduction 客户在开发量产型的ECU软件时&#xff0c;大…

并发编程理论基础——管程(并发编程的万能钥匙)(七)

什么是管程 Java采用了管程技术&#xff0c;synchronized关键字及wait()、notify()、notifyAll()三个方法都是管程的组成部分管程和信号量是等价的&#xff0c;管程和信号量之间可以互相实现英文名&#xff1a;Monitor 直译为监视器管程指的是管理共享变量以及对共享变量的操作…

项目性能优化之给dist文件夹中chunk-vendors.js做splitChunks分包,从而减少首屏加载时间

问题描述 我们项目做完,验收通过以后,就需要打包发布上线啦。于是我们执行命令:npm run build打dist包,打包完以后截图如下: 直接打包的chunk-vendors.js太大了 chunk-vendors.js文件太大了,所以我们需要将其优化一下,拆分一下 chunk-vendors.js是啥 chunk-vendors.j…

一种自定义SPI通信协议

本文介绍一种自定义SPI通信协议。 项目开发过程中&#xff0c;有时候会涉及到主处理器或FPGA和MCU之间的SPI通信&#xff0c;涉及到通信就需要考虑通信协议&#xff0c;本文给出一种简单的通信协议。 1.协议格式 协议格式如下图。 其中&#xff0c;将40 bit划分为2大部分&am…

代码随想录训练营Day 69|并查集理论基础、卡码网107.寻找存在的路径

1.并查集理论基础 并查集理论基础 | 代码随想录 并查集可以解决什么问题呢&#xff1f; 主要就是集合问题&#xff0c;两个节点在不在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 注意&#xff1a;求根是求箭头出发的数 路径压缩&#xff1a;求根的根。把根的根的…

【C语言】数据的存储

目录 Ⅰ、数据类型介绍 1.类型的基本归类&#xff1a; Ⅱ、整形在内存中的存储 1 .原码、反码、补码 2. 大小端介绍 3 练习&#xff1a; Ⅲ、浮点型在内存中的存储 1 .浮点数存储规则 本章重点 1. 数据类型详细介绍 2. 整形在内存中的存储&#xff1a;原码、反码、补码 3. …

测试卡无法仪表注册问题分析

1、问题描述 00101测试卡无法注册LTE网络&#xff0c;modemlog中发现终端未发起Attach请求&#xff0c;对比正常注册非正常注册的版本&#xff0c;发现正常的多出了ims apn。可以通过ATCGDCONT?来查询modem APN参数。 2、问题分析 目前Modem是一套&#xff0c;没有相关修改。因…

SpringBoot使用滑动窗口限流防止用户重复提交(自定义注解实现)

在你的项目中&#xff0c;有没有遇到用户重复提交的场景&#xff0c;即当用户因为网络延迟等情况把已经提交过一次的东西再次进行了提价&#xff0c;本篇文章将向各位介绍使用滑动窗口限流的方式来防止用户重复提交&#xff0c;并通过我们的自定义注解来进行封装功能。 首先&a…

vue3 element-plus 实现 table表格合并单元格 和 多级表头

多级表头 数据结构比较复杂的时候&#xff0c;可使用多级表头来展现数据的层次关系。 只需要将el-table-column 放置于el-table-column 中&#xff0c;你可以实现组头。 一般可以直接用官网提供的写法&#xff0c;但是有可能数据会比较多的时候&#xff0c;就需要我们稍微改造…

江门电子行业实施MES系统前后对比

在江门电子行业实施MES系统之前和之后的对比可以涉及以下几个方面&#xff1a; 生产效率提升&#xff1a;实施MES系统后&#xff0c;江门电子行业可以实现生产过程的实时监控和优化&#xff0c;减少生产中的浪费和停机时间&#xff0c;提高生产效率。 质量控制改善&#xff1a;…

【稀疏三维重建】Flash3D:单张图像重建场景的GaussianSplitting

项目主页&#xff1a;https://www.robots.ox.ac.uk/~vgg/research/flash3d/ 来源&#xff1a;牛津、澳大利亚国立 文章目录 摘要1.引言2.相关工作3.方法3.1 背景&#xff1a;从单个图像中重建场景3.2 单目前向的多个高斯 4.实验4.14.2 跨域新视角合成4.3 域内新视图合成 摘要 F…

ONLYOFFICE 桌面编辑器8.1最新版本强势来袭!

文章目录 软件介绍一、安装与界面安装过程用户界面 二、性能与稳定性启动速度与响应时间稳定性 三、兼容性与集成文件格式兼容性第三方集成 四、可支持多人协作五、功能齐全的PDF编辑器六、PDF表单七、文档编辑器中的新增功能八、总结九、自己的建议 软件介绍 在现代办公环境中…

Cell2Sentence:为LLM传输生物语言

像GPT这样的LLM在自然语言任务上表现出了令人印象深刻的性能。这里介绍一种新的方法&#xff0c;通过将基因表达数据表示为文本&#xff0c;让这些预训练的模型直接适应生物背景&#xff0c;特别是单细胞转录组学。具体来说&#xff0c;Cell2Sentence将每个细胞的基因表达谱转换…
最新文章