如何从 BCryptPasswordEncoder 获取原始密码

How to get original password from BCryptPasswordEncoder

我正在为我的应用程序使用 spring 安全性。当用户第一次注册时,他们的密码是用 BCryptPasswordEncoder.

加密的
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String hashedPassword = passwordEncoder.encode(password);

现在,如果要更改密码,用户输入他们当前的密码,我需要检查当前密码是否与保存在数据库中的加密密码相同。

我知道不可能用 BCryptPasswordEncoder 生成两个具有相同字符串的相同加密散列。因此,如果密码相同,比较密码的唯一方法可能是获取保存在数据库中的原始密码,然后与当前输入的密码进行比较。

那么,有什么办法可以比较密码或者从数据库保存的散列密码中获取原始密码吗?

您只需将原始密码与数据库中的编码密码进行比较。例如,

BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String p = bCryptPasswordEncoder.encode("SomeCoolPassword");
System.out.println(bCryptPasswordEncoder.matches("SomeCoolPassword", p));

是的,passwordEncoder 不会创建相同的散列,但您可以比较它们,如果它是从相同的字符串生成的,则 return 为真。检查我的例子:

public class Test {
    public static void main(String[] args) {
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        List<String> passwords = Arrays.asList(bCryptPasswordEncoder.encode("testPassword"),
                bCryptPasswordEncoder.encode("testPassword"),
                bCryptPasswordEncoder.encode("testPassword"),
                bCryptPasswordEncoder.encode("testPassword"));

        passwords.stream()
                .filter(e -> bCryptPasswordEncoder.matches("testPassword", e))
                .forEach(e -> System.out.println(true));
    }

}

我得到 4 true