• spring security BCryptPasswordEncoder加密解密,不错的随机盐,不错的加密解密方法


    项目中用这个加密感觉不错啊,推荐:

    1.先大体看看,了解一下

    浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches)

    spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着可以解密(这个与编码/解码一样),但是采用Hash处理,其过程是不可逆的。

    (1)加密(encode):注册用户时,使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。

    (2)密码匹配(matches):用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆的),而是使用相同的算法把用户输入的密码进行hash处理,得到密码的hash值,然后将其与从数据库中查询到的密码hash值进行比较。如果两者相同,说明用户输入的密码正确。

    这正是为什么处理密码时要用hash算法,而不用加密算法。因为这样处理即使数据库泄漏,黑客也很难破解密码(破解密码只能用彩虹表)。

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

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

    ---------------------------------------------------------------------------------------------------------------

    2.这里BCryptPasswordEncoder看看他怎么用:

    作者:知乎用户
    链接:https://www.zhihu.com/question/54720851/answer/288322108
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

    学习到这一块,查看了一些源码。以BCryptPasswordEncoder为例

    public class BCryptPasswordEncoderTest {
        public static void main(String[] args) {
            String pass = "admin";
            BCryptPasswordEncoder bcryptPasswordEncoder = new BCryptPasswordEncoder();
            String hashPass = bcryptPasswordEncoder.encode(pass);
            System.out.println(hashPass);
    
            boolean f = bcryptPasswordEncoder.matches("admin",hashPass);
            System.out.println(f);
    
        }
    }
    

    可以看到,每次输出的hashPass 都不一样,
    但是最终的f都为 true,即匹配成功。

    查看代码,可以看到,其实每次的随机盐,都保存在hashPass中。

    在进行matchs进行比较时,调用BCrypt 的String hashpw(String password, String salt)

    方法。两个参数即”admin“和 hashPass

    //******BCrypt.java******salt即取出要比较的DB中的密码*******
    real_salt = salt.substring(off + 3, off + 25);
    try {
    // ***************************************************
        passwordb = (password + (minor >= 'a' ? "00" : "")).getBytes("UTF-8");
    }
    catch (UnsupportedEncodingException uee) {}
    saltb = decode_base64(real_salt, BCRYPT_SALT_LEN);
    B = new BCrypt();
    hashed = B.crypt_raw(passwordb, saltb, rounds);
    

    假定一次hashPass为:$2a$10$AxafsyVqK51p.s9WAEYWYeIY9TKEoG83LTEOSB3KUkoLtGsBKhCwe

    随机盐即为 AxafsyVqK51p.s9WAEYWYe

    (salt = BCrypt.gensalt();中有描述)

    可见,随机盐(AxafsyVqK51p.s9WAEYWYe),会在比较的时候,重新被取出。

    即,加密的hashPass中,前部分已经包含了盐信息。

    --------------------------------------------------------------------------------------------------------------------

    3.在springcloud中整合,下面说的也不清楚。。。。。

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

    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 结果都不一样,但是存贮其中一次加密结果 也能够验证成功

    2019/06/14更新

    这个在新版本中是的结果不是上面知乎演示的结果,新版中是按照一列类规则进行验证的,加密结果前面并不包含盐

    原文地址:https://blog.csdn.net/lidew521/article/details/82463736

  • 相关阅读:
    antd按需加载
    解决vscode开发react项目没有代码提示问题
    在react中配置less
    flutter之fluro导航传参数
    Flutter游戏:简单规则与结束页
    zsh: command not found:XXX
    React的安装与使用
    git stash 用法总结和注意点
    【OSS】工具类
    ajax将数组或list集合传到后台 的 【坑】
  • 原文地址:https://www.cnblogs.com/jpfss/p/11023906.html
Copyright © 2020-2023  润新知