数据库中密码相关字段都不是明文,肯定是加密之后的,传统方式一般是使用MD5加密。
单纯使用不加盐的MD5加密方式,当两个用户的密码相同时,会发现数据库中存在相同内容的密码,这样也是不安全的。我们希望即便是两个人的原始密码一样,加密后的结果也不一样。
下面进行shiro密码 加密加盐配置:
1.ShiroConfig中添加密码比较器
1 | /** |
2.将密码比较器配置给ShiroRealm
1 | /** |
3.密码比较器RetryLimitHashedCredentialsMatcher
自定义的密码比较器,跟前面博客中逻辑没有变化,唯一变的是 继承的类从 SimpleCredentialsMatcher
变为 HashedCredentialsMatcher
在密码比较器中做了: 如果用户输入密码连续错误5次,将锁定账号,具体参考博客:https://blog.csdn.net/qq_34021712/article/details/80461177
RetryLimitHashedCredentialsMatcher完整内容如下:
1 | package com.springboot.test.shiro.config.shiro; |
4.修改ShiroRealm中doGetAuthenticationInfo方法
1 | package com.springboot.test.shiro.config.shiro; |
跟之前的 ShiroRealm
相比,唯一改变的了SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(),new MyByteSource(user.getUsername()),getName());
这一行代码,添加了 加盐参数。
注意:
大家可能看到了使用了 MyByteSource
而不是 ByteSource.Util.bytes(user.getUsername())
具体原因参考博客:https://blog.csdn.net/qq_34021712/article/details/84567437
5.下面是生成密码加密加盐的方法,可以在注册的时候对明文进行加密 加盐 入库
1 | package com.springboot.test.shiro; |
可能出现的问题
可能会发生这种情况,测试发现密码不对,具体原因debug都可以发现,这里直接把结果发出来:
第一种:
debug发现 传入的密码 经过加密加盐之后是对的,但是 从数据库中 获取的密码 却是明文,原因是在ShiroRealm
中 doGetAuthenticationInfo
方法中,最后返回的SimpleAuthenticationInfo
第二个参数 是密码,这个密码 不是从前台传过来的密码,而是从数据库中查询出来的
第二种:
debug发现 传入的密码 经过加密加盐之后是对的,但是 从数据库中 获取的密码 却是更长的一段密文,原因是在ShiroConfig
中配置的RetryLimitHashedCredentialsMatcher
一个属性:
1 | //是否存储为16进制 |
默认是true
,如果改为false
,则会出现 对比的时候从数据库拿出密码,然后转 base64
变成了另外一个更长的字符串,所以怎么对比都是不通过的。