Bootstrap

SpringSecurity密码编码器:使用BCrypt算法加密、自定义密码编码器

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);

    //判断加密密码是否需要再次进行加密,默认返回 false
    default 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 不可以逆

;