Spring 引导密码编码

Spring Boot Password Encoding

我是 Spring 引导新手,我正在尝试为我的 api 配置安全性。我正在使用 PasswordEncoding:

public static String encodePassword(String plainPassword){
    BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();
    return bCryptPasswordEncoder.encode(plainPassword);
}

在SecurityConfig中class我得到了以下方法:

@Bean
public PasswordEncoder getPasswordEncoder(){
    return new BCryptPasswordEncoder();
}

但是每次给定相同的输入,输出总是不同的,有人可以向我解释这背后的原因以及我如何解决这个问题吗?

这是设计使然,您无需“修复”。原因是因为BCrypt算法包含了salt,每次调用都会不一样。这意味着如果您尝试将 plain-text 密码编码为一个散列并将其与另一个散列进行比较,它将不会匹配。但是,您可以使用 BCryptPasswordEncoder 中的方法 matches 进行比较。

这是一个证明这一点的测试

@Test
public void encodeAndMatch() {
    BCryptPasswordEncoder bc = new BCryptPasswordEncoder();

    String p1 = bc.encode("password");
    String p2 = bc.encode("password");
    String p3 = bc.encode("password");
    
    assertNotEquals(p1, p2);
    assertNotEquals(p1, p3);
    assertNotEquals(p2, p3);

    assertTrue(bc.matches("password", p1));
    assertTrue(bc.matches("password", p2));
    assertTrue(bc.matches("password", p3));
}

在这里您可以看到相同的密码生成了三个不同的哈希值,但编码器仍然可以将原始 plain-text 密码与每个密码进行比较并匹配。