Shiro密码加密验证服务
来源:互联网 发布:七月与安生影评知乎 编辑:程序博客网 时间:2024/05/22 10:56
HashedCredentialsMatcher实现密码验证服务
Shiro提供了CredentialsMatcher的散列实现HashedCredentialsMatcher,和之前的PasswordMatcher不同的是,它只用于密码验证,且可以提供自己的盐,而不是随机生成盐,且生成密码散列值的算法需要自己写,因为能提供自己的盐。
1、生成密码散列值
此处我们使用MD5算法,“密码+盐(用户名+随机数)”的方式生成散列值:
Java代码
- String algorithmName = "md5";
- String username = "liu";
- String password = "123";
- String salt1 = username;
- String salt2 = new SecureRandomNumberGenerator().nextBytes().toHex();
- int hashIterations = 2;
- SimpleHash hash = new SimpleHash(algorithmName, password, salt1 + salt2, hashIterations);
- String encodedPassword = hash.toHex();
如果要写用户模块,需要在新增用户/重置密码时使用如上算法保存密码,将生成的密码及salt2存入数据库(因为我们的散列算法是:md5(md5(密码+username+salt2)))
密码重试次数限制
如在1个小时内密码最多重试5次,如果尝试次数超过5次就锁定1小时,1小时后可再次重试,如果还是重试失败,可以锁定如1天,以此类推,防止密码被暴力破解。我们通过继承HashedCredentialsMatcher,且使用Ehcache记录重试次数和超时时间。
com.github.zhangkaitao.shiro.chapter5.hash.credentials.RetryLimitHashedCredentialsMatcher:
Java代码
- public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
- String username = (String)token.getPrincipal();
- //retry count + 1
- Element element = passwordRetryCache.get(username);
- if(element == null) {
- element = new Element(username , new AtomicInteger(0));
- passwordRetryCache.put(element);
- }
- AtomicInteger retryCount = (AtomicInteger)element.getObjectValue();
- if(retryCount.incrementAndGet() > 5) {
- //if retry count > 5 throw
- throw new ExcessiveAttemptsException();
- }
- boolean matches = super.doCredentialsMatch(token, info);
- if(matches) {
- //clear retry count
- passwordRetryCache.remove(username);
- }
- return matches;
- }
如上代码逻辑比较简单,即如果密码输入正确清除cache中的记录;否则cache中的重试次数+1,如果超出5次那么抛出异常表示超出重试次数了
阅读全文
0 0
- Shiro密码加密验证服务
- Shiro(之一)-密码加密
- Shiro(之一)-密码加密
- shiro自定义密码验证
- shiro 密码加密和解密
- Shiro密码的MD5加密
- Shiro-密码的MD5加密
- Shiro-密码的MD5加密
- Shiro密码的MD5加密
- 在SSM中使用shiro实现登录验证(附密码加密)
- 在SSM中使用shiro实现登录验证(附密码加密)
- 格式验证、密码加密
- shiro 使用md5密码加密 锁定账户
- 【Shiro权限管理】9.Shiro密码加密匹配
- Shiro中的加密和验证策略
- 使用shiro进行登录密码安全验证
- 灵活使用shiro的密码服务模块
- MD5密码加密和验证
- windows快捷键
- 每天一个linux命令(61):wget命令
- Android Studio镜像
- 采用dom4j解析所有的元素并打印和保存到内存中
- H5-Spec
- Shiro密码加密验证服务
- SQL复制记录并修改字段(linux)
- 简单粗暴的SSM学习——HelloWrold
- 阿里游戏市场分析师模拟题
- CodeForces 492E Vanya and Field(拓展欧几里得)
- The type java.lang.AutoCloseable cannot be resolved. It is indirectly referenced from required .clas
- 计算机视觉初级部分知识体系
- 最小二乘法
- 开关电源三种拓扑的产生