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 密码与每个密码进行比较并匹配。
我是 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 密码与每个密码进行比较并匹配。