BCryptPasswordEncoder 加密算法解析

Posted ghimi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BCryptPasswordEncoder 加密算法解析相关的知识,希望对你有一定的参考价值。

Spring Security 中提供了 BCryptPasswordEncoder用于用户密码的加密和验证,这里讲解一下该 PasswordEncoder 的实现逻辑.

首先 BCryptPasswordEncoder 使用了 BCrypt 算法来对密码实现加密和验证。由于 BCrypt本身是一种 单向Hash算法,因此它和我们日常用的 MD5一样,通常情况下是无法逆向解密的。

在 BSD系统中 BCrypt 算法主要用来替代 md5 加密算法,它使用了一种可变版本的Blowfish流密码算法。通过多次加盐和随机数,大大提高了通过彩虹表撞库的形式破解密码的难度.因此这套加密算法被广泛用于许多系统的密码加密当中。目前来看该加密算法没有已知的漏洞。在新应用中BCrypt加密算法是推荐的四种密码散列算法之一.

流密码加密

相较于 分组加密方案消息填充算法,流密码加密算法方案本身就可以加密任意长度的数据,无需密码分组和消息填充。

加密参数

BCryptPasswordEncoder 加密过程中,会提供主要参数来辅助加密:

  1. salt:可选的加盐字符串,如果未指定,则会自动生成一个加盐字符.取值范围为 [./0-9A-Za-z]

  2. rounds 一个可选的随机数,默认为 12 ,取值范围为 4 到 31 之间,左闭右闭.

  3. version 用于指定一个 BCrypt 算法版本,如果未指定,则默认为 2b,可选版本有:

    1. 2,BCrypt 的第一个版本,由于存在一个小的安全缺陷,目前已不再使用
    2. 2a在一些实现中存在罕见的安全缺陷,被 2b版本取代
    3. 2y使用 crypt_blowfish BCrypt算法实现格式化,除了名称外与 2b无明显区别
    4. 2b官方最新的 BCrypt 算法版本,目前为默认版本


参考资料

passlib.hash.bcrypt - BCrypt

Spring Security中的BCryptPasswordEncoder

对称密钥加密算法

Class BCrypt

More Secure Passwords in Bcrypt — Beating the 72 Bytes Limitation

springboot+security 的BCryptPasswordEncoder 使用

任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。有很多标准的算法比如SHA或者MD5,结合salt(盐)是一个不错的选择。 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强哈希方法来加密密码。

BCrypt强哈希方法 每次加密的结果都不一样。

好了废话不多说,就看怎么整合吧。。

1. 修改 WebSecurityConfig

    @Autowired
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.userDetailsService(customUserService).passwordEncoder(new BCryptPasswordEncoder());
    

这样配置就好了。但是关于怎么初始化密码呢,和注册用户的时候怎么给密码加密呢?

  public SysUser create(User u user)
        //进行加密
        BCryptPasswordEncoder encoder =new BCryptPasswordEncoder();
        sysUser.setPassword(encoder.encode(user.getRawPassword().trim()));
        userDao.create(user);
    return sysUser;

虽然每次 BCryptPasswordEncoder 的 encoder 结果都不一样,但是存贮其中一次加密结果 也能够验证成功

以上是关于BCryptPasswordEncoder 加密算法解析的主要内容,如果未能解决你的问题,请参考以下文章

BCryptPasswordEncoder加密

BCryptPasswordEncoder加密

springboot+security 的BCryptPasswordEncoder 使用

spring security +MySQL + BCryptPasswordEncoder 单向加密验证 + 权限拦截 --- 心得

spring security +MySQL + BCryptPasswordEncoder 单向加密验证 + 权限拦截 --- 心得

BCryptPasswordEncoder的使用及原理