早些年,那会把一个老项目的登录模块重构,从Shiro转Spring Security,那时候快速换完后没多看,最近又在公司做类似同样的操作,给一个老项目加上Spring Security。所以我决定简单写点什么。
相信用过Spring Security的伙伴们,应该对这个BCryptPasswordEncoder 都有好奇。
为啥好奇, 这个家伙的加密方法encode每次生成的密后密码都不一样,但是校验方法matches却能准确地去检验匹配。
不多说,现在一起来看看。
1. 先看encode 这个方法:
不用细看,我们看两个关键信息:
BCrypt.gensalt
BCrypt.hashpw
没错,这个加密算法其实是 强哈希+盐+密钥(默认用密码)。 因为使用到了哈希,所以是不可逆。
这也就能初步明白matches 为什么只能用来做校验匹配,而不是直接解密。 这点意味着就算你加密后的密码泄露了,别人想直接得到明文几乎是不可能的。
接下来,有必要看hashpw么,放到下面一起看。
2. 接下来看matches 这个方法:
关注点:
BCrypt.checkpw(rawPassword.toString(), encodedPassword);
没错,因为哈希无法逆操作,所以匹配过程中也是用了hashpw 。 可以看到了checkpw这个方法,我们传入的密文其实命名已经是 hashed ,没错,这个密文就是一个带有盐值的哈希。
hashpw 里面,前面一大堆都是在校验密文格式对不对,因为可以看到我们的加密后得到的密文格式是不是有点像?:
符合格式了就开始截取:
明文有了,盐值也有了,那么匹配就跟我们一般接口的sign认证一样了。
简单的了解就到此吧。
PS: 这个BCryptPasswordEncoder加密&校验方法当个工具类,导包+启动类屏蔽Security默认自动装配,用起来也是可以的。
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})