Spring Security PasswordEncoder

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security PasswordEncoder相关的知识,希望对你有一定的参考价值。

参考技术A Spring Security使用单向密码转换存储密码,也就是加密后的用户密码无法恢复成明文,只能用作密码比较。另外随着计算机性能的提升,传统的SHA-256哈希加密方式不再安全。Spring Security采用了自适应单向加密方式,它通过刻意消耗计算机计算能力来加强密码被破解的难度,比如一个密码加密一次需要100毫秒,可能破解整个系统的密码只需要几小时,如果一个密码加密一次需要1秒那么破解整个系统的密码就需要几天。以 BCryptPasswordEncoder 为例,它内部有一个叫 strength 的工作因素,其值范围是4~31,值越大其循环加密的次数就越多。

当通过 BCryptPasswordEncoder.encode 进行加密的时候, strength 这个参数会被附加到 salt 中, BCrypt.hashpw 通过 salt 获取 strength ,然后通过 BCrypt.crypt_raw 来使用。

在 BCrypt.crypt_raw 中的入参 log_rounds 就是之前提到的 strength ,它通过 rounds = 1 << log_rounds; 左移获得一个循环数,最终通过该循环数提高整个加密过程的计算能力消耗。

PasswordEncoder 接口是Spring Security提供的统一密码接口,主要为整个安全框架提供一个统一的加密过程。其主要的实现类如下:

DelegatingPasswordEncoder 是Spring Security默认使用的加密算法。我们从它的名称其实可以猜测出来它本身并不是一个具体的算法实现类,而是一个算法代理类。这个类主要目的是兼容老旧系统,方便老旧系统的升级改造。

DelegatingPasswordEncoder 可以通 PasswordEncoderFactories.createDelegatingPasswordEncoder() 来创建一个默认的实现方式。

PasswordEncoderFactories.createDelegatingPasswordEncoder() 会首先创建一个 Map ,然后将各种 PasswordEncoder 的具体算法对象存入 Map 中。那么如何使用 DelegatingPasswordEncoder 呢?

以上就是 DelegatingPasswordEncoder 所存储的密码例子,其具体格式如下

其中 id 就是所使用的加密算法, encodedPassword 就是 id 所对应的具体加密算法加密后的值。

以 bcrypt 为例, DelegatingPasswordEncoder 会首先解析出 bcrypt ,然后在 Map 中查找具体的实现算法,最终由 BCryptPasswordEncoder 来完成加密或匹配过程。

Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core

【中文标题】Spring 中的 spring-security-oauth2 与 spring-security-oauth2-core【英文标题】:spring-security-oauth2 vs spring-security-oauth2-core in Spring 【发布时间】:2019-09-25 05:04:18 【问题描述】:

spring-security-oauth2和spring-security-oauth2-core有什么区别? spring-security-oauth2 被 spring-security-oauth2-core 替代了吗?

spring-security-oauth2 发布链接: http://repo.spring.io/release/org/springframework/security/oauth/spring-security-oauth2/

spring-security-oauth2-core 发布链接 http://repo.spring.io/release/org/springframework/security/spring-security-oauth2-core/

【问题讨论】:

【参考方案1】:

是的,有很大的不同。 spring-security-oauth2(Spring Security OAuth 项目)是no longer being actively developed。

展望未来,它将在 Spring Security 5 中实现(在 spring-security-oauth2-core 中)。这很令人困惑,因为许多教程使用以前的 Spring Security OAuth(@EnableResourceServer@EnableAuthorizationServer@EnableOAuth2Sso 注释通常会放弃它)。

【讨论】:

【参考方案2】:

第一个链接与 Spring 4 相关,它与 Spring Security 版本相匹配。您可以在 pom.xml 文件中验证这一点。

第二个链接与 Spring 5 和 Spring Security 5 相关。这不仅可以从您在该链接中看到的版本中直接看出,而且您可以在 Spring Security 5 documentation 中找到直接命名的依赖项。

【讨论】:

【参考方案3】:

区别在spring git仓库中有描述

https://github.com/spring-projects/spring-security/wiki/OAuth-2.0-Migration-Guide

它是旧库:security/oauth/spring-security-oauth2/ 如您所见,该库位于 spring-security 的“oauth”组中。

我不建议将旧库用作客户端,因为存在许多未解决的问题,包括有关存储 clientContext 的问题(库使用代理而不是普通实体,因此您在使用 MA 时会遇到问题带分布式缓存)。此外,它不允许同时使用多个 OAuth2.0 提供程序(只有一个)。

同时,该库提供了一个显着优势,即使用未在新库中实现的授权服务器。

【讨论】:

以上是关于Spring Security PasswordEncoder的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:2.4 Getting Spring Security

没有 JSP 的 Spring Security /j_spring_security_check

Spring-Security

Spring Security 登录错误:HTTP 状态 404 - /j_spring_security_check

未调用 Spring Security j_spring_security_check

Spring Security入门(3-7)Spring Security处理页面的ajax请求