开始
Spring Security 中含有两种经常被使用的密码加密器:Pbkdf2PasswordEncoder 、 BCryptPasswordEncoder
加密器工作形式:
传入原本密码,通过 encode() 方法获得加密后的字符串,字符串的生成与时间或者 hash 有关。所以,即使需要加密的密码相同,每次生成的字符串也不同,但是通过相同密码生成的字符串即使不同,也都可以通过加密器的 matches() 方法与原本密码匹配成功,通过校验
推荐使用
推荐使用 Pbkdf2PasswordEncoder 加密器,该加密器可以在创建时可以传入一个字符串阴钥,从而获得一个只属于你的加密器,即使数据库中密码的加密字符串被盗取,如果没有阴钥,则永远无法获得原密码
而对于 BCryptPasswordEncoder ,被盗取加密字符串后,如果用户使用了简单密码,则可以通过彩虹表获取原密码
SpringBoot测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ConfigTest {
// 注入配置的阴钥
@Value("${system.user.password.secret}")
private String secret;
@Test
public void testPasswordEncoder(){
Pbkdf2PasswordEncoder pbkdf2PasswordEncoder = new Pbkdf2PasswordEncoder(secret);
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String pbk1 = pbkdf2PasswordEncoder.encode("123456");
String pbk2 = pbkdf2PasswordEncoder.encode("123456");
String bcr1 = bCryptPasswordEncoder.encode("123456");
String bcr2 = bCryptPasswordEncoder.encode("123456");
System.out.println("pbk1: " + pbk1);
System.out.println("pbk2: " + pbk2);
System.out.println("pbk1 password:" + pbkdf2PasswordEncoder.matches("123456",pbk1));
System.out.println("pbk2 password:" + pbkdf2PasswordEncoder.matches("123456",pbk2));
System.out.println("---------------------");
System.out.println("bcr1: " + bcr1);
System.out.println("bcr2: " + bcr2);
System.out.println("bcr1 password:" + bCryptPasswordEncoder.matches("123456",bcr1));
System.out.println("bcr2 password:" + bCryptPasswordEncoder.matches("123456",bcr2));
}
}
测试结果
可见加密字符串的不同并不会影响与原密码的匹配