java防止暴力破解用户名的5种常见方法

系统的账号密码如果被破解了,对我们的整个系统都是巨大隐患。
通常情况下,我们会使用以下方法阻止黑客破解账号密码:
1、网站管理入口禁止使用弱口令帐号,建议使用复杂口令,比如:大小写字母与数字的组合,口令长度不小于8位等;
2、验证码在服务端校验;
3、建议采用防高频策略,针对同一IP短时间内的高频请求进行限时锁定;
4、第三方WEB防火墙来加固整个网站系统。
5、诱导/模糊提示。

具体操作:

方案1

在前端或后台对密码进行校验
前端校验

<html>
<head>
    <meta charset="utf-8">
    <title>密码验证</title>
</head>
<body>
</br>
<input type="text" id="test1">
<input type="button" id="te" οnclick="test()">

<script>
    function test(){
        var text= document.getElementById("test1").value;
        var   re =/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,20}$/;
        //正则表达式,大小写及数字,8-20位
        var result=  re.test(text);
        if(result)
        {
            alert("输入正确");
            //发送请求给后台修改密码。
        }else
        {
            alert("密码至少包含大写字母,小写字母,数字,且不少于8位");
        }

    }
</script>
</body>

</html>

java后台校验
第一种:

String check = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z_]{8,20}$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(password);
if(!matcher.matches()){
    throw new MyParameterException(187, ApiConfirm._187);

}

不符合直接抛出异常,异常为自定义异常。

第二种:

/**
* 包含大小写字母及数字且在8-20位
* 是否包含
* @param str
* @return
*/
public static boolean isLetterDigit(String str) {
   boolean isDigit = false;//定义一个boolean值,用来表示是否包含数字
   boolean isLetter = false;//定义一个boolean值,用来表示是否包含字母
   for (int i = 0; i < str.length(); i++) {
       if (Character.isDigit(str.charAt(i))) {   //用char包装类中的判断数字的方法判断每一个字符
           isDigit = true;
       } else if (Character.isLetter(str.charAt(i))) {  //用char包装类中的判断字母的方法判断每一个字符
           isLetter = true;
       }
   }
   String regex = "^[a-zA-Z0-9]{8,20}$";
   boolean isRight = isDigit && isLetter && str.matches(regex);
   return isRight;
}

方案2

从java后台做一个验证码给前端展示,在java后台进行校验验证码。

方案3

防高频策略,说白了就是记录一下登录人的次数,如果失误了多少次就要冻结账号。
该防御是后台防御。
关键字段,status,fault。
status存放是否冻结。0不冻结。1冻结。
fault存放错误次数。
先进行校验验账号是否存在。
select count(1) from user where loginID =‘(具体账号)’
不存在,返回false。
存在,校验是否冻结。
select count(1) from user where loginID =‘’ and status =‘0’
冻结,返回false。
存在,且不冻结,校验密码:
select count(1) from user where loginID =‘(具体账号)’ and password = ‘(输入的密码)’
密码准确,允许登录。
密码不准确,且非冻结状态:
执行 select fault from user where loginID =‘(具体账号)’
后台判断fault是否大于等于3(譬如我设定密码不能错3次)
如果是,执行:
update user set status = ‘1’,fault=‘0’ where loginID =’(具体账号)’
值得注意的是,我在这里是冻结账号同时清空错误次数的操作。也可以是解除冻结的时候再清除错误次数。
如果fault不大于3,则执行
fault +=1;
update user set fault=‘fault’ where loginID =’(具体账号)’

方案4

该方案,想要效果好,是需要购买第三方防火墙,一般来说,很少有公司愿意花钱去搞,我所在的公司也没有这个,具体操作,尚未清楚。

方案5

这是个最为简单又实用的方案
修改前端alert提示。
前端不提示:
1、密码错误
2、账号有误
而是改为提示:账号或密码有误,使攻击者无法获知账号是否存在,密码是否有误,增加暴力破解的难度。
如果非要有提示密码错误的次数,则需要配合方案3一起实施。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要定义一个Java类来处理用户名和密码验证的服务。这个类可以实现一个Servlet或者一个SpringMVC Controller。 在类中,您需要实现一个名为“service”的方法来处理HTTP请求。这个方法应该接受HTTP请求对象和HTTP响应对象作为参数。 在方法中,您可以使用request.getParameter()方法来获取HTTP请求中的用户名和密码参数。然后,您可以将这些参数与您的数据库或其他用户存储服务进行比较。如果用户名和密码是有效的,您可以将HTTP响应设置为成功状态,并将用户信息存储在一个Cookie或Session中,以便将来的请求可以验证用户身份。 如果用户名和密码无效,您可以返回一个错误状态码和错误消息,以便客户端可以显示错误消息。 以下是一个简单的Java代码示例,用于处理用户名和密码验证的服务方法: ```java public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); if (isValidCredentials(username, password)) { response.setStatus(HttpServletResponse.SC_OK); // Store user information in cookie or session } else { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid credentials"); } } private boolean isValidCredentials(String username, String password) { // Implement logic to validate credentials } ``` 请注意,上面的代码仅提供了一个简单的示例。在实际应用中,您需要实现更复杂的逻辑来验证用户凭据,例如使用加密技术保护密码,并从安全角度考虑防止SQL注入等攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值