java - Spring 安全: using 2 different hashing methods in a single application

标签 java spring spring-security

我有一个使用 Spring Security 来验证用户身份的应用程序。 用户和散列/加盐密码存储在数据库中。没有什么特别的,带有用户名/密码字段的 USER 表。 该应用程序使用 BCryptPasswordEncoder 进行哈希函数。 现在我需要将一些旧用户数据迁移到应用程序。 旧数据密码使用其他哈希函数(例如 MD5)进行哈希处理。 我可以将旧数据插入到同一个 USER 表中,但随后我可以使用不同的哈希函数对密码进行哈希处理。

如何配置 Spring Security 在对旧用户/新用户进行身份验证时选择适当的哈希函数?

更新

“MigrateUsersPasswordEncoder”wrom here似乎是解决该问题的绝佳方法

最佳答案

bcrypt 密码具有非常独特的表现形式,可以使用正则表达式进行测试。我能想到的最简单的解决方案是创建一个可供身份验证管理器使用的密码编码器组合。它应该根据密码的表示形式决定使用哪个编码器。

简单示例:

class PasswordEncoderComposite implements PasswordEncoder {
    private Pattern BCRYPT_PATTERN = Pattern.compile("\\A\\$2a?\\$\\d\\d\\$[./0-9A-Za-z]{53}");

    public String encode(CharSequence rawPassword) {
        if (BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
            return new BCryptPasswordEncoder().encode(rawPassword);
        } else {
            return new StandardPasswordEncoder().encode(rawPassword);
        }
    }

    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        if (BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
            return new BCryptPasswordEncoder().matches(rawPassword, encodedPassword);
        } else {
            return new StandardPasswordEncoder().matches(rawPassword, encodedPassword);
        }
    }
}

关于java - Spring 安全: using 2 different hashing methods in a single application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23510740/

相关文章:

spring - @Required 注解如何与 JavaConfig 一起使用?

spring - Spring Security 从 3.2.7 更新到 4.0.2.RELEASE 如何处理 defaultRolePrefix ="ROLE_"

java - Rectangle 和 Rectangle2D 的区别

java - 用于 I/O 超时的最佳异常类型是什么?

java - Apache poi Excel : Creating a formula based on the integer index of the column

java 按用户输入的字符串值对字符串列表进行排序

spring - 如果远程存储库不可用,如何为 Spring Cloud Config 服务设置本地后备配置?

java - 防止Spring的RestTemplate为multipart/form-data中的每个参数添加 header

java - 如何禁用 Spring Security 过滤器

java - 使用 XML 配置的 Spring Security 不会对用户进行身份验证