Security-Spring-如何实现多种加密方案共存 (security翻译成中文)

教程大全 2025-07-08 13:26:39 浏览

这篇文章中,松哥给大家介绍了两种密码加密方案,但是两种都是独立使用的!能不能在同一个项目中同时存在多种密码加密方案呢?答案是肯定的!

今天松哥就来和大家聊一聊,如何在 Spring Security 中,让多种不同的密码加密方案并存。

为什么要加密?常见的加密算法等等这些问题我就不再赘述了,大家可以参考之前的:Spring Boot 中密码加密的两种姿势!,咱们直接来看今天的正文。

1.PasswordEncoder

在 Spring Security 中,跟密码加密/校验相关的事情,都是由 PasswordEncoder 来主导的,PasswordEncoder 拥有众多的实现类:

这些实现类,有的已经过期了,有的用处不大。对于我们而言,最常用的莫过于 BCryptPasswordEncoder。

PasswordEncoder 本身是一个接口,里边只有三个方法:

如何实现多种加密方案共存

PasswordEncoder 的实现类,则具体实现了这些方法。

2.PasswordEncoder 在哪里起作用

对于我们开发者而言,我们通常都是在 SecurityConfig 中配置一个 PasswordEncoder 的实例,类似下面这样:

剩下的事情,都是由系统调用的。今天我们就来揭开系统调用的神秘面纱!我们一起来看下系统到底是怎么调用的!

首先,松哥在前面的文章中和大家提到过,Spring Security 中,如果使用用户名/密码的方式登录,密码是在 DaoAuthenticationProvider 中进行校验的,大家可以参考:SpringSecurity 自定义认证逻辑的两种方式(高级玩法)。

我们来看下 DaoAuthenticationProvider 中密码是如何校验的:

可以看到,密码校验就是通过 passwordEncoder.matches 方法来完成的。

那么 DaoAuthenticationProvider 中的 passwordEncoder 从何而来呢?是不是就是我们一开始在 SecurityConfig 中配置的那个 Bean 呢?

我们来看下 DaoAuthenticationProvider 中关于 passwordEncoder 的定义,如下:

从这段代码中可以看到,在 DaoAuthenticationProvider 创建之时,就指定了 PasswordEncoder,似乎并没有用到我们一开始配置的 Bean?其实不是的!在 DaoAuthenticationProvider 创建之时,会制定一个默认的 PasswordEncoder,如果我们没有配置任何 PasswordEncoder,将使用这个默认的 PasswordEncoder,如果我们自定义了 PasswordEncoder 实例,那么会使用我们自定义的 PasswordEncoder 实例!

从何而知呢?

我们再来看看 DaoAuthenticationProvider 是怎么初始化的。

DaoAuthenticationProvider 的初始化是在 InitializeUserDetailsManagerConfigurer#configure 方法中完成的,我们一起来看下该方法的定义:

从这段代码中我们可以看到:

至此,就真相大白了,我们配置的 PasswordEncoder 实例确实用上了。

3.默认的是什么?

同时大家看到,如果我们不进行任何配置,默认的 PasswordEncoder 也会被提供,那么默认的 PasswordEncoder 是什么呢?我们就从这个方法看起:

继续:

可以看到:

我们来看下 DelegatingPasswordEncoder 的定义:

这段代码比较长,我来和大家挨个解释下:

OK,至此,相信大家都明白了 DelegatingPasswordEncoder 的工作原理了。

如果我们想同时使用多个密码加密方案,看来使用 DelegatingPasswordEncoder 就可以了,而 DelegatingPasswordEncoder 默认还不用配置。

4.体验

接下来我们稍微体验一下 DelegatingPasswordEncoder 的用法。

首先我们来生成三个密码作为测试密码:

生成结果如下:

接下来,我们把这三个密码拷贝到 SecurityConfig 中去:

这里三个用户使用三种不同的密码加密方式。

配置完成后,重启项目,分别使用 javaboy/123、sang/123 以及 江南一点雨/123 进行登录,发现都能登录成功。

5.意义何在?

为什么我们会有这种需求?想在项目种同时存在多种密码加密方案?其实这个主要是针对老旧项目改造用的,密码加密方式一旦确定,基本上没法再改了(你总不能让用户重新注册一次吧),但是我们又想使用最新的框架来做密码加密,那么无疑,DelegatingPasswordEncoder 是最佳选择。

好啦,这就是今天和小伙伴们分享的多种密码加密方案问题,感兴趣的小伙伴记得点个在看鼓励下松哥哦~


笔记本BOIS密码怎么设置

进入Advanced BIOS Features,选择Security Option(安全选项),里面有两个选项:System和Setup,第一个表示无论进入系统和进入BIOS都需要密码,第二个表示只有在进入BIOS时才需要密码。 进入BIOS后选择Set Supervis0r Password(设置管理员密码),即进入BIOS的密码,按两次回车即可设置密码为空。

IBM TPM安全芯片怎么用

安全芯片是一项针对商业用户的安全技术。 主要的优点是对存储在安全芯片里的数据进行高可靠性的加密处理,使这些数据很难被非法窃取。 IBM有一个专门的安全软件:IBM Client Security Software,配合安全芯片使用,可以对用户的数据进行加密处理,将密钥通过安全芯片加密后存储在安全芯片中。 通俗地讲,就是将你设置的开机密码、硬盘密码、BIOS密码、指纹信息、硬盘上数据加密使用的密钥之类的全部再次加密后,存储在安全芯片中,如果想要破解就需要首先破解安全芯片。 正常使用的时候完全可以不管它,如果不是通过CCS软件主动使用安全芯片,完全可以当它不存在,也与安装操作系统无关,安全芯片不需要任何的驱动程序。 所谓把机器用成砖头是指如果你丢失了硬件的密码,比如开机密码、BIOS密码、硬盘密码,因为首先要破解安全芯片,所以就比一般的机器更难破解了。 IBM提供了很多的安全功能来保护数据安全,比如硬盘密码,如果设置了硬盘密码,因为硬盘密码是存储在安全芯片里,安全芯片是装在主板上的,所以这块硬盘就算被拆到别的机器上也无法读出数据。 如果你忘记了硬盘密码,那这块硬盘就相当于报废了。 所以一般不要随意设置密码,如果设置了一定要牢记。

联想笔记本电脑 不小心设置开机要求输入密码提示Enter HDD password

这个是提示输入硬盘锁密码,只有正确输入密码后,才能开启硬盘进入系统。 关闭方式:在开机时按F2键进入系统设置程序关闭HDD password就可以了。 硬盘加密后,硬盘上的数据就不能够读取。 不知道密码的人,即使把硬盘装到其它的机上去作为第二硬盘,也根本无法读取硬盘上的数据。 硬盘锁对那些冲这硬盘数据而来的小偷作用特别大。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐