文档章节

使用Ehcache缓存在用户输错n次账户密码之后冻结m小时的简单实现

Mr_Tank_
 Mr_Tank_
发布于 2016/07/13 15:57
字数 913
阅读 140
收藏 8
点赞 2
评论 0

我们经常会看到有些系统,为了提高账户安全性,会在用户输入n次密码时候锁定对应的账户一段时间,这样可以避免暴力破解用户密码(说实话这样行不行我也不知道)。不知道正确的实现姿势应该是什么样的,但是我们可以利用缓存来简单实现这个功能,先来一盘代码:

0、初始化配置

为每个用户初始化保存到缓存中的key

    private int MAX_FAIL_TIMES = 3;// 默认最多允许出错次数
	private int FROZEN_TIME = 1;// 默认冻结时间,单位[小时]
	private String COUNT_KEY;// 失败次数缓存Key
	private String TIME_KEY;// 冻结时间缓存Key
	private long USERID;// 冻结的用户ID

	private String CACHE_REGION = "Account";

	public static FrozenAccountTool init(String key, long userId, int maxFailTimes, int frozenTime) {

		FrozenAccountTool frozenAccountTool = new FrozenAccountTool();

		frozenAccountTool.USERID = userId;
		frozenAccountTool.COUNT_KEY = key + "#USER#COUNT#" + frozenAccountTool.USERID;
		frozenAccountTool.TIME_KEY = key + "#USER#TIME#" + frozenAccountTool.USERID;
		frozenAccountTool.MAX_FAIL_TIMES = maxFailTimes > 0 ? maxFailTimes : frozenAccountTool.MAX_FAIL_TIMES;
		frozenAccountTool.FROZEN_TIME = frozenTime > 0 ? frozenTime : frozenAccountTool.FROZEN_TIME;
		return frozenAccountTool;
	}

1、记录验证失败次数

首先需要记录用户输错的次数,每次验证失败的时候,失败次数+1

    // 失败次数+1
	public void failCountIncrease() {
		int failCount = GetFailCount();
		_SetFailCount(failCount + 1);
	}

GetFailCount() 方法用于从缓存里面取出当前失败的次数,具体实现如下:

        // 获取失败次数
	public int GetFailCount() {
		return EhcacheUtil.get(CACHE_REGION, COUNT_KEY) == null ? 1 : (Integer) EhcacheUtil.get(CACHE_REGION, COUNT_KEY);
	}

再看一下 _SetFailCount() 方法,这里是为了在失败次数大于最大失败次数的时候设置当前时间为锁定时间,用于后面判断解锁时间是否已经到了:

        // 設置失败次数
	private void _SetFailCount(int failCount) {
		EhcacheUtil.put(CACHE_REGION, COUNT_KEY, failCount);
		if (failCount >= MAX_FAIL_TIMES) {
			SetFrozenTime();
		}
	}

2、判断账户是否被冻结

<1>.首先判断当前时间点距离被锁定的时间是否大于设定锁定的时间,大于表示已经解锁,重置锁定设置的缓存数据;注:这个要先判断,要不然锁定之后就永远无法解锁了

<2>.如果时间还没到设定锁定的时间则判断当前失败次数是否大于最大失败次数,大于表示已经被锁定

public boolean IsFrozen() {
		long frozenTimeMillis = GetFrozenTime();
		System.out.println(new Date() + ">锁定时间:" + GetFrozenTime());
		System.out.println(new Date() + ">当前错误次数:" + GetFailCount());
		if (frozenTimeMillis > 0 && (System.currentTimeMillis() - frozenTimeMillis > FROZEN_TIME * 60 * 60 * 1000)) {
			System.out.println(new Date() + ">锁定时间到,解锁账号");
			resetFrozen();
			return false;
		} else if (GetFailCount() >= MAX_FAIL_TIMES) {
			System.out.println(new Date() + ">账号已锁定..");
			return true;
		}
		System.out.println(new Date() + ">账号未锁定..");
		return false;
	}

温馨提示:以上的方法命名不符合java规范,大写是为了避免get、set、is开头的方法和javabean规范的冲突,仅供参考

** 3、如何使用 **

输入图片说明

4、测试代码

        FrozenAccountTool frozenAccountTool1 = FrozenAccountTool.init("GETCASH", 593115, 5, 1);
		for (int i = 0; i < 5; i++) {
			frozenAccountTool1.failCountIncrease();
			Thread.sleep(2000);
		}
		boolean result = true;
		while (result) {
			result = frozenAccountTool1.IsFrozen();
			Thread.sleep(5000);
		}

5、测试结果 (这里只设置锁定了0.01个小时)

输入图片说明

6、最后

我们可以看到开源中国社区的登陆也是用了同样的原理,用户输错2次密码的时候会出现验证码,输错密码次数大于限定的次数后该email账号会被锁定两个小时

(1)输错两次密码后,万恶的验证码出现了

输入图片说明

(2)输错N次之后

输入图片说明

不相信可以自己去试一下哦,似乎可以做什么坏事的样子

关于Ehcache工具类和其他代码已经托管到:https://git.oschina.net

© 著作权归作者所有

共有 人打赏支持
Mr_Tank_

Mr_Tank_

粉丝 226
博文 38
码字总数 14028
作品 0
深圳
前端工程师
项目案例分享二:密码策略与上次交互式登录

今天有个朋友跟我聊天时提到他们公司的域用户经常会遇到被锁定的状态,而且4小时后会自动解锁,想查看AD里面是否能够统计和显示域用户登录失败次数和时间等信息。所以搭建了个小测试来解决这...

余二五
2017/11/16
0
0
当当全网冻结账户:被误判的危机?

3月23日,当当网运营高级总监梁健鹏很意外地发现,从19日晚22点到22日24点这74个小时里,当当网所有被冻结了账户的用户中只有6位致电当当网反映自己的账户异常。 另一个数据令梁健鹏更感蹊跷...

红薯
2012/03/25
2.5K
16
Linux帐号管理

新增用户:useradd [option] 用户名称 -u 指定UID -g 指定初始组initial group ,就是/etc/passwd第四个字段GID对应的组 -G 此账户还可以加入的用户组 -M 强制不创建主文件夹 -m 强制创建主文...

Billy112487983
2014/04/21
0
0
Freebsd 下用 sshguard 防止暴力破解 ssh 密码

在 Freebsd 控制台或用 dmesg -a 查看系统消息的时候会发现类似于下面的大量信息,这是因为有人在尝试暴力破解 SSH 密码的原因。 Jun 22 06:42:00 vps sshd[80092]: error: PAM: authenticat...

芒果龙
2011/11/02
0
0
Active Directory颗粒化密码策略配置

1 多元(颗粒化)密码策略介绍 在windows server 2000/2003中,我们无法针对域用户不同而设置不同密码策略, 域用户密码策略和账户设置都 由默认域策略控制,如果要重新建立策略我们必须创建...

杰克斯帕罗
2017/11/08
0
0
微信设置好这三个选项,转错账也不怕要不回来!

  现在随着微信的用户量的不断攀升,微信支付也被使用的越来越广泛,但是这也给一些不法分子提供了生存的空间,一不小心账号就被盗走,微信里的钱也不保。还有随着微商的兴起,我们越来越多...

手机数据恢复大师
2017/10/18
0
0
马老师聊安全 弱密码的防御与检测

  *本文原创作者:ChuanFile,本文属FreeBuf原创奖励计划,未经许可禁止转载   弱密码一直是广大安全人员的痛。web管理页面、公网服务连接密码(如邮件、sql等)、内网终端、服务器登录等...

FreeBuf
05/07
0
0
Java的过滤器黑名单列表如何动态添加删除

RT,我想实现这样一个功能,用一个Filter来限制那些恶意登录的人,连续输错三次密码就把IP记录下来,加黑名单列表,这个功能能实现了,现在是想把黑名单里面的用户冻结30分钟就释放掉,怎么做...

东北·赵本山
2012/02/03
1K
2
使用MVC Remote验证的注意点

这其实是一个比较简单的问题,但往往挺容易被忽略,这次我们在推广我们的互联网平台的时候就吃了这么一个大亏。 一般用户注册过程中,前端注册往往会检验用户名、昵称是否已存在,甚至验证码...

WilsonHuang
2013/12/23
0
0
linux 防爆破方法

利用pam 认证模块锁定多次登陆失败的用户 pam 模块存放在 /lib/security/pam*.so 编辑 /etc/pam.d/sshd 添加以下内容 auth required pamtally2.so deny=5 locktime=60 当用户通过ssh 尝试登陆...

屋脊之上
2014/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部