1、Spring Security 密码编码器
Spring Security 作为一个功能完备的安全性框架,一方面提供用于完成加密操作的 PasswordEncoder 组件,另一方面提供一个可以在应用程序中独立使用的密码模块。
1.1 PasswordEncoder 抽象接口
在 Spring Security 中,PasswordEncoder 接口代表的是一种密码编码器,用于指定密码的具体加密方式,以及如何在给定的一段加密字符串与明文之间完成匹配校验。
PasswordEncoder 接口定义如下:
package org.springframework.security.crypto.password;public interface PasswordEncoder
{//对原始密码进行编译String encode(CharSequence var1);//对提交的原始密码与库中存储的加密密码进行比对boolean matches(CharSequence var1, String var2);//判断加密密码是否需要再次进行加密,默认返回 falsedefault boolean upgradeEncoding(String encodedPassword){return false;}
}
1.2 内置的 PasswordEncoder 接口实现类
Spring Security 内置了一大批 PasswordEncoder 接口的实现类,比较常见的 PasswordEncoder 实现类集体解释如下:
实现类 | 说明 |
---|---|
NoOpPasswordEncoder | 以明文形式保存密码,不对密码进行编码。这种 PasswordEncoder 实现类通常只用于演示,不建议用于生成环境。 |
StandardPasswordEncoder | 使用 SHA-256 算法对密码执行散列操作。 |
BCryptPasswordEncoder | 使用 BCrypt 强散列算法对密码执行散列操作。 |
Pbkdf2PasswordEncoder | 使用 PBKDF2 算法对密码执行散列操作。 |
2、Spring Security 使用 BCrypt 算法加密与校验
BCrypt 加密是一种安全且高效的密码存储与验证方法,它结合了密码哈希函数和加密算法。BCrypt 加密基于哈希函数,并使用一个密码和一个随机生成的盐值作为输入,生成一个固定长度的密码哈希值。这个哈希值在每次密码输入时都会重新生成,且会随着盐值的改变而改变。这种机制确保了即使是相同的密码,在每次加密时也会生成不同的哈希值,从而有效增强了安全性。Bcrypt 生成的密文是 60 位的,而 MD5 的是 32 位的。
BCrypt 不可以逆