如果您想切换到更安全的密码编码机制,那么我建议您使用BCrypt。我会使用这样的东西来迁移您的用户:
// Implement the old PasswordEncoder interface
public class MigrateUsersPasswordEncoder implements PasswordEncoder {
@Autowired
ShaPasswordEncoder legacyEncoder;
@Autowired
JdbcTemplate template;
BCryptPasswordEncoder bcryptEncoder = new BCryptPasswordEncoder();
@Override
public String encodePassword(String rawPass, Object salt) {
return bcryptEncoder.encode(rawPass);
}
@Override
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
if (legacyEncoder.isPasswordValid(encPass, rawPass, salt)) {
template.update("update users set password = ? where password = ?", bcryptEncoder.encode(rawPass), encPass);
return true;
}
return bcryptEncoder.matches(rawPass, encPass);
}
}
您可以通过密码字段的格式查看迁移的用户比例。BCrypt 字符串具有以$
符号开头的独特语法。
其他答案之一指出,此代码可能会意外地同时更新多个密码。该问题表明正在使用自定义盐,因此如果随机选择盐,碰撞的可能性可以忽略不计,但情况可能并非总是如此。如果更新了两个密码,会出现什么问题?然后可以从 bcrypt 哈希中检测到帐户具有相同的密码。无论如何都是这样,因为它要求 SHA 哈希值相同才能进行更新。如果您认为这可能是一个问题(例如,由于盐选择不佳或什至使用了未加盐的散列),那么修改 SQL 以检测这一点并使用单独的 BCrypt 散列值执行多次更新将是微不足道的。