浅谈BCrypt算法


前言

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使用了随机的盐,其安全性也更高

猜你喜欢

转载自blog.csdn.net/weixin_72125569/article/details/126710694
今日推荐