如何从BCryptPasswordEncoder

时间:2016-08-24 07:13:27

标签: java spring passwords bcrypt

我正在为我的应用程序使用spring security。当用户第一次注册时,他们的密码将使用BCryptPasswordEncoder进行加密。

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

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

我知道用BCryptPasswordEncoder生成两个带有相同字符串的相同加密哈希是不可能的。因此,只有比较密码才能获得相同的唯一方法是获取保存在数据库中的原始密码,并与当前输入的密码进行比较。

那么,有没有办法比较密码或从数据库中获取原始密码保存的哈希密码?

2 个答案:

答案 0 :(得分:4)

您只需要根据db中的编码密码检查原始密码。例如,

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

答案 1 :(得分:2)

是的,passwordEncoder没有创建相同的哈希,但您可以比较它们,如果它是从同一个字符串生成的,它将返回true。检查我的例子:

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