我有一个使用 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/