前言
BCrypt算法是一种基于哈希算法的算法,所以,这种算法是不可逆的
一、BCrypt算法是什么?
BCrypt算法是一种基于哈希算法的算法,所以,这种算法是不可逆的
通过BCrypt算法进行编码后的结果,长度固定为60字符
使用同一个原文进行反复编码,每次得到的结果都是不同的,因为在编码过程中,BCrypt使用了随机的盐,并且,使用的盐也作为编码结果的一部分保存了下来
图解如下:
二、使用步骤
1.对明文进行加密
创建BCryptPasswordEncode类对象,使用对象.encode(明文)方法即可生成密文
代码如下(示例):
public void testEncode(){
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
for (int i = 0; i < 5; i++) {
String rawPassword = "123456";
String encodedPassword = passwordEncoder.encode(rawPassword);
//在编码过程中,BCrypt使用了随机的盐
//所以每次得到的结果都不一致
log.debug("原文={},密文={}",rawPassword,encodedPassword);
//原文=123456,密文=$2a$10$xd.seKl0H3k/Ks72BoKJVO95yCvhhSy4u9nXzEOBOeJ7lxxke69Aq
//原文=123456,密文=$2a$10$2rfZBv4gjy4MeJ2h93VC3eARlVlBJRKje8UMMu9Ul4JV6FG.OPTxy
//原文=123456,密文=$2a$10$dGSHSIhvwnflGBIrdNsTwusPpvNbvjxzwz10mg3RTVrfR1sxhKmda
//原文=123456,密文=$2a$10$NUFTdtD1/rcA7d4qzpQ3PecDEIvzTp7HeuFl8gv7zcg1O/kw0vNqq
//原文=123456,密文=$2a$10$3CjSrCyMv/imDsJiJvwOVOxuNcaUOppExXg5kZLA1DJ0nZ/7aw48G
}
}
2.验证
使用对象.matches(明文,密文)验证是否匹配,由于在生成密文的时候,盐作为编码结果的一部分保存在密文中,所以在验证时:
a.会将密文中的盐值部分取出,加到明文中,生成对应密文
b.将生成的密文与参数中的密文对比,看是否一致
c.如果一致,方法返回值为true;反之,方法返回值则为false
代码如下(示例):
@Test
public void testMatches(){
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String rawPassword = "123456";
//从上面运行得到的密文随机取一个验证
String encodedPassword = "$2a$10$3CjSrCyMv/imDsJiJvwOVOxuNcaUOppExXg5kZLA1DJ0nZ/7aw48G";
//使用matches()方法,需传参原文,密文,返回值为布尔型,true则验证成功
boolean matches = passwordEncoder.matches(rawPassword,encodedPassword);
log.debug("原文={},密文={},匹配结果={}",rawPassword,encodedPassword,matches);
}
总结
相较于消息摘要算法,BCrypt算法操作简洁,由于在编码过程中,BCrypt使用了随机的盐,其安全性也更高