我正在使用BCryptPasswordEncoder使用Spring Security。现在,要更改密码,我需要将用户提供的现有密码与DB值进行比较。

但是由于salt是由BCryptPasswordEncoder动态生成的,因此每次我从下面的方法中获得不同的哈希值时,不一定与我的DB值匹配。

public static String encodePassword(String password) {
    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    String hashedPassword = passwordEncoder.encode(password);
    return hashedPassword;
}

这个问题有什么补救办法?如何识别用于数据库字段的盐,并在上述方法中使用相同的盐?

最佳答案

matches接口(interface)上使用PasswordEncoder方法检查密码是否有效,而不是再次对其进行编码并与现有哈希进行比较。

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String existingPassword = ... // Password entered by user
String dbPassword       = ... // Load hashed DB password

if (passwordEncoder.matches(existingPassword, dbPassword)) {
    // Encode new password and store it
} else {
    // Report error
}

09-10 08:19