巧妙利用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.pswp.cn/bicheng/81089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81089.shtml
英文地址,請注明出處:http://en.pswp.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;或者簡單的業務邏輯錯誤。 數據驗證的主要…