BCryptPasswordEncoder加密和匹配的原理 和 springsecurity 的 rememberme原理

举报
知识浅谈 发表于 2022/06/28 22:36:20 2022/06/28
【摘要】 只知道这个的用法,心里着实难受,所以看了看底层,简单做下总结。 BCryptPasswordEncoder算法和shiro的区别: 其实和shiro中区别就是shiro 中的salt是自己指定的,然后存...

只知道这个的用法,心里着实难受,所以看了看底层,简单做下总结。

BCryptPasswordEncoder算法和shiro的区别:
其实和shiro中区别就是shiro 中的salt是自己指定的,然后存到数据库,BCryptPasswordEncoder加密算法是随机生成的和加密后的密码一起拼接到一起存到数据库。

举个我调试的时候的例子:

注册时候调用encode(明文密码)

首先第一次注册的时候,会从后台先获取随机盐VM/wbXrA4UYbITsQKOHNF. 这个每一次的不一定因为随机的。
对明文密码进行加密,我输入的密码 123 用上边的随机盐加密后得到HBp2Bmiej/q/iggq/g6DMwcGlh3wxwi ,
然后拼接到一起 $2a$10$VM/wbXrA4UYbITsQKOHNF.HBp2Bmiej/q/iggq/g6DMwcGlh3wxwi 存进数据库对应的密码的字段。

登陆的时候matches(明文密码,数据库中加密的密码)

之后登录的时候除了前端传过来的明文密码,从数据库中找到加密的密码,因为这个加密的密码中有加密时候的盐。
从加密的密码中把盐抽取出来VM/wbXrA4UYbITsQKOHNF. ,然后$2a$10$(这个都是在根据前端传来的明文密码生成加密密码的时候经过一些判断加上的) +盐 + 用盐和前端传来的明文密码生成新的加密密码
然后用新的加密密码和 数据库中的加密密码进行匹配查看是否相等,其实这时候如果密码正确,两个加密密码的字符串是相等的。

rememberme原理

当设置这个rememberme之后,登录的时候会生成JSESSION 和 remember-me两个字段给前端。

remember的生成过程

Base64(Base64(用户名):Base64(过期时间):Base64(用户名和密码和过期时间加密))

remember的使用过程

判断是否有这个remember-me字段,有的话,先整体解码,再对用户名 和过期时间 进行Base64解码,从数据库获得密码,然后 new = Base64(Base64(用户名):Base64(过期时间):Base64(用户名和数据库获得密码和过期时间加密)),和前端的remeber-me 字符串进行匹配,相等之后就是登录状态。

再具体的请各位继续探索,学无止境。

文章来源: englishcode.blog.csdn.net,作者:知识浅谈,版权归原作者所有,如需转载,请联系作者。

原文链接:englishcode.blog.csdn.net/article/details/124676233

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。