若依用户密码如何生成和验证的?
新增用户的时候设置用户密码
在系统中添加用户的时候会设置用户的密码,此时会生成密码。源码位置在:
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值进行比对,如果一致密码正确,否则不正确。
文章评论