若依密码产生和验证过程

2021-09-21 2592点热度 5人点赞 0条评论

若依用户密码如何生成和验证的?

新增用户的时候设置用户密码

在系统中添加用户的时候会设置用户的密码,此时会生成密码。源码位置在:

ruoyi-modules\ruoyi-system\src\main\java\com\ruoyi\system\controller\SysUserController.java的add方法。

具体设置用户密码的代码是:

user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));

分析密码产生过程

SecurityUtils.encryptPassword方法的全部源码如下:

/**
     * 生成BCryptPasswordEncoder密码
     *
     * @param password 密码
     * @return 加密字符串
     */
    public static String encryptPassword(String password)
    {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        return passwordEncoder.encode(password);
    }

因此若依的用户密码是用BCryptPasswordEncoder生成密码。

简要分析BCryptPasswordEncoder

以下摘要CSDN博客的部分内容,详情内容可以点击链接进入原博文读取。

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

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

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

————————————————
原文链接:SpringSecurity中的密码加密算法:BCryptPasswordEncoder

验证原理

BCryptPasswordEncoder每次matches验证的时候,在比较的时候都要从hash值中将salt取出来,因此知道了hash值就能够知道salt,就可以根据salt去除密码的hash值。然后与数据库中的hash值进行比对,如果一致密码正确,否则不正确。

王显锋

激情工作,快乐生活!

文章评论