1.密码加密
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TestPasswordEncode{
@Test
void testPassword() {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
// 原始密码
String sourcePassword = "000000";
// 加密后的密码
String resPassword1 = encoder.encode(sourcePassword);
// 加密后的密码
String resPassword2 = encoder.encode(sourcePassword);
System.out.println("原密码:" + sourcePassword);
System.out.println("加密密码1:" + resPassword1);
System.out.println("加密密码2:" + resPassword2);
}
}
备注:同一个密码,两次调用encode生成的加密密码是不一样的
2.密码匹配
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TestPasswordEncode{
@Test
void testPassword() {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
// 原始密码
String sourcePassword = "000000";
// 加密后的密码
String resPassword1 = encoder.encode(sourcePassword);
// 加密后的密码
String resPassword2 = encoder.encode(sourcePassword);
// 匹配结果1
boolean match1 = encoder.matches(sourcePassword, resPassword1);
// 匹配结果2
boolean match2 = encoder.matches(sourcePassword, resPassword2);
System.out.println("原密码:" + sourcePassword);
System.out.println("加密密码1:" + resPassword1);
System.out.println("加密密码2:" + resPassword2);
System.out.println("匹配结果1:" + match1);
System.out.println("匹配结果2:" + match2);
}
}
备注:两次加密后生成的加密串虽然不同,调用matches方法都返回true
3.原理
- BCryptPasswordEncoder加密时会默认加盐,且每次的盐值是随机的。
- 由此可以解释同一个密码,调用两次encode方法生成的加密串是不一样的。
- 生成salt盐值的方法
- 加密串中包含生成当前加密串的盐值和hash值
- matches匹配方法每次需要传入原始密码和该原始密码的encode加密串
- matches方法验证的过程等同于encode的过程,将传入的密码按照加密串携带的盐值进行加密,加密后与传入的加密串作比较
- 由此可以解释同一个密码加密后生成不同的加密串依然可以匹配成功。