巧妙利用redis防爆破

爆破,也就是通过海量的尝试,最终确定密码,人们设置密码具有习惯性,好记、简单、有象征等,也就有密码字典一说,但是该字典也是巨量的,但是相对于各种字母符号等组合就显得轻量非常多

在Java Spring Boot中,使用Redis实现账号密码防爆破是一种常见的安全措施。通过Redis的高性能和原子性操作,可以有效地限制用户在一定时间内的登录尝试次数,从而防止暴力破解攻击。以下是一个巧妙的实现方案:

1. 引入依赖

首先,在pom.xml中引入Spring Boot的Redis依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置Redis

application.propertiesapplication.yml中配置Redis连接信息:

spring.redis.host=localhost
spring.redis.port=6379

3. 创建Redis工具类

创建一个Redis工具类,用于操作Redis中的登录尝试次数:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class RedisLoginAttemptService {private static final String LOGIN_ATTEMPT_KEY_PREFIX = "login_attempt:";private static final int MAX_ATTEMPTS = 5; // 最大允许的登录尝试次数private static final long LOCK_TIME = 30 * 60; // 锁定时间,单位:秒@Autowiredprivate StringRedisTemplate redisTemplate;/​**​* 记录登录尝试** @param username 用户名* @return 当前尝试次数*/public int recordLoginAttempt(String username) {String key = LOGIN_ATTEMPT_KEY_PREFIX + username;Integer attempts = redisTemplate.opsForValue().increment(key, 1).intValue();if (attempts == 1) {redisTemplate.expire(key, LOCK_TIME, TimeUnit.SECONDS);}return attempts;}/​**​* 检查是否超过最大尝试次数** @param username 用户名* @return 是否超过最大尝试次数*/public boolean isBlocked(String username) {String key = LOGIN_ATTEMPT_KEY_PREFIX + username;Integer attempts = redisTemplate.opsForValue().get(key) == null ? 0 : Integer.parseInt(redisTemplate.opsForValue().get(key));return attempts != null && attempts >= MAX_ATTEMPTS;}/​**​* 重置登录尝试次数** @param username 用户名*/public void resetLoginAttempts(String username) {String key = LOGIN_ATTEMPT_KEY_PREFIX + username;redisTemplate.delete(key);}
}

4. 在登录逻辑中使用

在登录逻辑中使用上述工具类来限制登录尝试次数:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class LoginService {@Autowiredprivate RedisLoginAttemptService loginAttemptService;@Autowiredprivate UserRepository userRepository; // 假设有一个UserRepository用于验证用户public boolean login(String username, String password) {// 检查是否被锁定if (loginAttemptService.isBlocked(username)) {throw new RuntimeException("账号已被锁定,请稍后再试");}// 验证用户名和密码User user = userRepository.findByUsername(username);if (user == null || !user.getPassword().equals(password)) {// 记录登录尝试loginAttemptService.recordLoginAttempt(username);throw new RuntimeException("用户名或密码错误");}// 登录成功,重置登录尝试次数loginAttemptService.resetLoginAttempts(username);return true;}
}

5. 控制器层

在控制器层调用登录服务:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LoginController {@Autowiredprivate LoginService loginService;@PostMapping("/login")public String login(@RequestParam String username, @RequestParam String password) {try {if (loginService.login(username, password)) {return "登录成功";}} catch (RuntimeException e) {return e.getMessage();}return "登录失败";}
}

6. 也可以加入ip封禁

启动应用后,存在ip胡乱请求,也可以加入ip封禁,当ip存在大量登录失败请求,可以将ip进行限制,比如1个小时最多进行5~7次登录,超过拉进黑名单,接下来半个小时或一天都不再校验他的登录请求,但是每次也返回一个请求成功的返回码或者错误的登录令牌,欺骗爆破工具,真真假假,虚虚实实,使它爆破难度激增

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Uniapp开发鸿蒙购物项目教程之样式选择器

大家好&#xff0c;今天依然为大家带来鸿蒙跨平台开发教程的分享&#xff0c;我们本系列的教程最终要做一个购物应用&#xff0c;通过这个项目为大家分享uniapp开发鸿蒙应用从配置开发环境到应用打包上架的完成过程。 昨天的文章实现了应用首页的轮播图&#xff0c;其中涉及到…

2、ubantu系统配置OpenSSH | 使用vscode或pycharm远程连接

1、OpenSSH介绍 OpenSSH&#xff08;Open Secure Shell&#xff09;是一套基于SSH协议的开源工具&#xff0c;用于在计算机网络中提供安全的加密通信。它被广泛用于远程系统管理、文件传输和网络服务的安全隧道搭建&#xff0c;是保护网络通信免受窃听和攻击的重要工具。 1.1…

Leetcode刷题 | Day63_图论08_拓扑排序

一、学习任务 拓扑排序代码随想录 二、具体题目 1.拓扑排序117. 软件构建 【题目描述】 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的内容&#xff0c;这意味着如果文件 A 依…

uniapp中vue3和pinia安装依赖npm install失败

目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 用uni-app开发小程序的时候&#xff0c;使用了vue3pinia,安装依赖的时候发现vue和pinia的版本问题&#xff0c;安装失败&#xff0c; npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve np…

2025认证杯第二阶段数学建模B题:谣言在社交网络上的传播思路+模型+代码

2025认证杯数学建模第二阶段思路模型代码&#xff0c;详细内容见文末名片 一、引言 在当今数字化时代&#xff0c;社交网络已然成为人们生活中不可或缺的一部分。信息在社交网络上的传播速度犹如闪电&#xff0c;瞬间就能触及大量用户。然而&#xff0c;这也为谣言的滋生和扩…

【C#】Thread.Join()、异步等待和直接join

JogThread.Join() 是 .NET 中 System.Threading.Thread 类的一个方法&#xff0c;用来让当前调用线程暂停执行&#xff0c;直到目标线程&#xff08;这里是 JogThread&#xff09;终止为止。以下是它的核心语义和你在 UI 代码里需要注意的几个相关知识点。 1. Thread.Join() 的…

牛客网NC22012:判断闰年问题详解

牛客网NC22012&#xff1a;判断闰年问题详解 &#x1f4dd; 题目描述 题号&#xff1a;NC22012&#xff08;牛客网&#xff09; 时间限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C/Rust/Pascal 32 M&#xff0c;其他语言64 M 判断一个…

鸿蒙开发——1.ArkTS声明式开发(UI范式基本语法)

鸿蒙开发——1、ArkTS声明式开发:UI范式基本语法 [TOC](鸿蒙开发——1、ArkTS声明式开发:UI范式基本语法)一、ArkTS的基本组成&#xff08;1&#xff09;核心概念&#xff08;像贴标签一样控制组件&#xff09;&#xff08;2&#xff09;基础工具包&#xff08;现成的积木块&am…

【SPIN】PROMELA语言编程入门基础语法(SPIN学习系列--1)

PROMELA&#xff08;Protocol Meta Language&#xff09;是一种用于描述和验证并发系统的形式化建模语言&#xff0c;主要与SPIN&#xff08;Simple Promela Interpreter&#xff09;模型检查器配合使用。本教程将基于JSPIN&#xff08;SPIN的Java图形化版本&#xff09;&#…

Automatic Recovery of the Atmospheric Light in Hazy Images论文阅读

Automatic Recovery of the Atmospheric Light in Hazy Images 1. 论文的研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法、模型与公式2.1 方法框架2.1.1 方向估计(Orientation Estimation)2.1.2 幅值估计(Magnitude Estimation)2.2 与传统方法的对…

基于微信小程序的在线聊天功能实现:WebSocket通信实战

基于微信小程序的在线聊天功能实现&#xff1a;WebSocket通信实战 摘要 本文将详细介绍如何使用微信小程序结合WebSocket协议开发一个实时在线聊天功能。通过完整的代码示例和分步解析&#xff0c;涵盖界面布局、WebSocket连接管理、消息交互逻辑及服务端实现&#xff0c;适合…

速通:国际数字影像产业园园区服务体系

速通&#xff1a;国际数字影像产业园园区服务体系 国际数字影像产业园服务体系致力于构建全周期、多维度、高效率的产业赋能平台&#xff0c;旨在优化营商环境&#xff0c;激发企业活力&#xff0c;推动数字影像产业集群化、高端化发展。 一、基础运营与智慧管理服务 智慧化…

DeerFlow:字节新一代 DeepSearch 框架

项目地址&#xff1a;https://github.com/bytedance/deer-flow/ 【全新的 Multi-Agent 架构设计】独家设计的 Research Team 机制&#xff0c;支持多轮对话、多轮决策和多轮任务执行。与 LangChain 原版 Supervisor 相比&#xff0c;显著减少 Tokens 消耗和 API 调用次数&#…

MySQL 大表中添加索引的两种常见方式及其优缺点分析

引言 在数据库性能优化过程中&#xff0c;给大表添加索引是一项常见且重要的操作。由于大表数据量庞大&#xff0c;索引的创建过程往往涉及较高的系统开销和复杂的操作流程。本文将介绍两种在大表中添加索引的常见方法&#xff1a;直接添加索引和表复制方式&#xff0c;分别分…

Ubuntu系统挂载磁盘并配置开机自动挂载

今天买了个服务器然后挂载了一个500G的磁盘&#xff0c;但是登录进去后发看不到&#xff0c;就是下面这样的 只能看到100G的系统盘 rootecm-74de:/usr/local# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 3.1G 1.1M 3.1G 1% /run /dev/vda2 …

Android开发-Application

在Android应用开发中&#xff0c;Application类扮演着非常重要的角色。它作为整个应用程序的全局单例实例存在&#xff0c;在应用启动时最先被创建&#xff0c;并且在整个应用生命周期内持续存在。通过自定义Application类&#xff0c;开发者可以执行全局初始化操作、管理全局状…

边缘计算平台

本文来源 &#xff1a; 腾讯元宝 边缘计算平台是一种在靠近数据源头的网络边缘侧部署的分布式计算架构&#xff0c;通过融合网络、计算、存储和应用核心能力&#xff0c;就近提供实时、低延迟的智能服务。以下是其核心要点&#xff1a; ​​1. 定义与特点​​ ​​定义​​&a…

Spring 框架 JDBC 模板技术详解

一、JDBC 模板技术概述 在传统 JDBC 开发中&#xff0c;开发人员需要手动处理数据库连接&#xff08;Connection&#xff09;、事务管理、语句执行&#xff08;Statement&#xff09;和结果集&#xff08;ResultSet&#xff09;等繁琐操作&#xff0c;不仅代码冗余度高&#x…

Axure难点解决分享:统计分析页面引入Echarts示例动态效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…

SpringBoot 数据校验与表单处理:从入门到精通(万字长文)

一、SpringBoot 数据验证基础 1.1 数据验证的重要性 在现代Web应用开发中&#xff0c;数据验证是保证系统安全性和数据完整性的第一道防线。没有经过验证的用户输入可能导致各种安全问题&#xff0c;如SQL注入、XSS攻击&#xff0c;或者简单的业务逻辑错误。 数据验证的主要…