0
点赞
收藏
分享

微信扫一扫

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


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

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 字符串进行匹配,相等之后就是登录状态。

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


举报

相关推荐

0 条评论