實現加鹽加密方法以及MappedByteBuffer,RandomAccess

目錄

自己實現?

?Spring Security

MappedByteBuffer

RandomAccess


加鹽加密的實現

自己實現?

傳統MD5可通過彩虹表暴力破解,?

加鹽加密算法是一種常用的密碼保護方法,它將一個隨機字符串(鹽)添加到原始密碼中,然后再進行加密處理。

  • 1. 每次調用方法產生一個唯一鹽值(UUID )+密碼=最終密碼。
  • 解密:需要驗證的密碼(用戶輸入的密碼),最終加密的密碼(存在于數據庫)得到鹽值,鹽值存在最終密碼的某個位置,——>鹽值{32位}$最終密碼{32位};
  • ?2. 對組合后的字符串進行多次哈希計算,每次哈希時都使用鹽值和先前的哈希值。哈希計算的次數由工作因子控制。

驗證密碼
已有:用戶輸入的明文密碼、此用戶在數據庫存儲的最終密碼=[鹽值$加密后的密碼]
32位32位
1.從最終密碼中得到鹽值
2.將用戶輸入的明文密碼+鹽值進行加密操作=加密后的密碼3.使用鹽值+分隔符+加密后的密碼生成數據庫存儲的密碼
4.對比生成的最終密碼和數據庫最終的密碼是否相等如果相等,那么用戶名和密碼就是對的,反之則是密碼輸入錯誤。?

package com.example.demo.common;import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;import java.nio.charset.StandardCharsets;
import java.util.UUID;public class PasswordUtils {//1.加鹽生成密碼public static String encrypt(String password){//鹽32位String salt= UUID.randomUUID().toString().replace("-","");String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());String finalPassword=salt+"$"+saltPassword;return finalPassword;}//2.生成加鹽密碼public static String encrypt(String password,String salt){String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());String finalPassword=salt+"$"+saltPassword;return finalPassword;}/**驗證密碼** @param :用戶輸入的明文密碼* @param :數據庫保存的最終密碼* @return*/public static boolean check(String inputPassword , String finalPassword){if(StringUtils.hasLength(inputPassword)&&StringUtils.hasLength(finalPassword)&&finalPassword.length()==65){String salt=finalPassword.split("\\$")[0];String confirmPssword=PasswordUtils.encrypt(inputPassword,salt);return confirmPssword.equals(finalPassword);}return false;}public static void main(String[] args) {String password="123456";String finalPassword=encrypt(password);System.out.println(PasswordUtils.encrypt(password));String inputPassword="12345";String inputPassword2="123456";System.out.println("比對結果1:"+ check(inputPassword,finalPassword));System.out.println("比對結果2  :"+ check(inputPassword2,finalPassword));//check(inputPassword2,finalPassword);}
}

?

?Spring Security

是提供身份驗證和授權的框架?,可用于用戶認證,訪問控制,安全事件和日志記錄等

還有就是Spring Security加鹽

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

?這樣甚至改了頁面

當用這個認證密碼授權成功后才會到我們的登錄頁面

所以我們要排除SpringSecurity自動加載?

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})

package com.example.demo;import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;@SpringBootTest()
class  Demo1ApplicationTests {@Testvoid contextLoads() {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();String password ="123456";// 第一次加密String finalPassword1 = passwordEncoder.encode(password);System.out.println("第1次加密:" + finalPassword1);// 第二次加密String finalPassword2 = passwordEncoder.encode(password);System.out.println("第2次加密:" + finalPassword2);// 第三次加密String finalPassword3 = passwordEncoder.encode(password);System.out.println("第3次加密:" + finalPassword3);// 驗證密碼String inputPassword = "12345";System.out.println("錯誤密碼比對結果: " + (passwordEncoder.matches(inputPassword, finalPassword1)));String inputPassword2 = "123456";System.out.println("正確密碼比對結果: " + (passwordEncoder.matches(inputPassword2, finalPassword1)));}}

?

MappedByteBuffer

MappedByteBuffer 是 Java NIO 包提供的一種用于內存映射文件的緩沖區類型它可以將文件的一部分或整個文件映射到內存中,以便進行更高效的讀寫操作

使用 MappedByteBuffer 的步驟如下:

1. 獲取文件通道:通過 RandomAccessFile、FileInputStream 或 FileChannel 等方式獲取文件的 FileChannel 對象。

2. 創建 MappedByteBuffer:使用 `map()` 方法將文件的一部分或整個文件內容映射到內存中,并返回一個 MappedByteBuffer 對象。
?

? ?MappedByteBuffer mappedBuffer = channel.map(FileChannel.MapMode.READ_WRITE, position, size);
  • channel 是 FileChannel 對象,表示要映射的文件通道。
  • FileChannel.MapMode.READ_WRITE 表示映射模式,可選擇的模式有:
  1. READ_ONLY:只讀模式,映射的數據不能進行修改。
  2. READ_WRITE:讀寫模式,映射的數據可進行讀寫操作。
  3. PRIVATE:私有模式,對映射的數據的修改不會影響到原文件。
  • position 是要映射的文件位置,表示從文件的哪個位置開始映射。
  • size 是映射的大小,表示映射的字節數。

3. 通過 MappedByteBuffer 對象進行讀寫操作:可以通過 MappedByteBuffer 對象的方法進行數據的讀取和寫入,如 get(), put(), getChar(), putChar()`等。

4. 關閉文件通道和釋放資源:在不再使用時,需要關閉文件通道和釋放 MappedByteBuffer 對象相關的資源。
?

? ?? ?channel.close();

MappedByteBuffer 只是對文件內容進行了內存映射,并不會自動將修改的數據寫回到原文件。如果需要將修改的數據同步到磁盤上的文件,可以通過調用 MappedByteBuffer 的 `force()` 方法強制刷新緩沖區。

使用 MappedByteBuffer 可以實現高效的文件讀寫操作,尤其適用于對大文件進行隨機訪問和修改的場景。

?

在Java中,處理大文件時常用的有基于`MappedByteBuffer`的NIO(New I/O)和基于`BufferedInputStream`、`BufferedOutputStream`等帶緩沖的傳統IO流。下面是它們之間的一些區別和相對優勢:

1. 內存映射文件(MappedByteBuffer):
? ?- **優勢**:
? ? ?- 避免了數據在Java堆內存和本地內存的多次拷貝,提高了IO操作的效率。
? ? ?- 可以利用操作系統的虛擬內存機制,對文件進行部分映射,實現了按需加載,對于大文件的處理性能更好。
? ? ?- 適合隨機訪問,可以直接在內存中修改文件內容,不需要通過讀取和寫入的方式。
? ?- **劣勢**:
? ? ?- 需要謹慎管理內存映射,避免內存泄漏和資源未釋放的問題。
? ? ?- 對于頻繁讀寫的大文件,可能會導致內存占用過高。

2. 緩沖流(BufferedInputStream、BufferedOutputStream)
? ?- **優勢**:
? ? ?- 通過緩沖區減少了對底層IO系統調用的次數,提高了IO操作效率。
? ? ?- 可以適應各種大小的文件讀寫,并且易于使用。
? ? ?- 適合順序讀寫,對于較小的文件處理效率較高。
? ?- **劣勢**:
? ? ?- 在處理大文件時,需要在Java和操作系統之間來回拷貝數據,可能會導致性能瓶頸。
? ? ?- 不支持直接在內存中修改文件內容,需要通過讀取和寫入的方式來進行操作。

綜上所述,對于大文件的處理,基于`MappedByteBuffer`的NIO操作相對于傳統的緩沖流操作具有更高的性能和更少的內存開銷,特別是在需要隨機訪問大文件內容時,`MappedByteBuffer`更為適用。但需要注意合理管理內存映射,避免潛在的風險。而基于緩沖流的傳統IO操作適用于各種大小的文件處理,易于使用,但在處理大文件時可能會存在性能瓶頸。

RandomAccess

RandomAccessFile 類是 Java IO 包中的一個用于隨機訪問文件的工具類,它可以讀取或寫入文件的任意位置。與其他 IO 類不同,RandomAccessFile 可以支持對文件內容的隨機讀寫操作,并且可以通過指定文件指針的位置實現隨機訪問

使用 RandomAccessFile 類進行文件操作的常見步驟如下:

1. 創建 RandomAccessFile 對象,需要指定文件路徑和打開模式("r" 表示只讀,"rw" 表示讀寫)。
?

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");

2. 使用 RandomAccessFile 提供的方法進行讀寫操作:
?

? ?- `read()`:從當前文件指針位置讀取一個字節的數據并將文件指針后移。- `write(int b)`:將一個字節的數據寫入到當前文件指針位置,并將文件指針后移。- `read(byte[] buffer)`:從當前文件指針位置讀取指定長度的字節數組數據,并將文件指針后移相應的字節數。- `write(byte[] buffer)`:將指定長度的字節數組數據寫入到當前文件指針位置,并將文件指針后移相應的字節數。- `seek(long position)`:將文件指針移動到指定的位置。

3. 在完成文件讀寫操作后,需要關閉 RandomAccessFile 對象,釋放資源。
?

 ?raf.close();

RandomAccessFile 類提供了一些靈活的方法來操作文件,但也需要謹慎處理文件指針位置和邊界條件,以避免讀寫錯誤或越界訪問。另外,RandomAccessFile 類通常用于處理二進制文件,而不是用于處理文本文件。在讀取文本文件時,可以使用更方便的 BufferedReader 或 Scanner 類。

RandomAccessFile更適合小文件,支持多線程,適合靈活隨機讀取文件的各個部分。

MapperdByteBuffer:適合大文件,將文件映射到內存來處理文件,直接訪問內存,避免頻繁對磁盤進行io操作

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213735.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213735.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣17. 電話號碼的字母組合(java 回溯法)

Problem: 17. 電話號碼的字母組合 文章目錄 題目描述思路解題方法復雜度Code 題目描述 思路 題目給定一串數字&#xff0c;要求我們找出所有可能的字母組合&#xff0c;即我們可以窮舉出所有可能的結果&#xff0c;而涉及到窮舉我們自然可以想到利用回溯來解決問題&#xff0c…

xv6 中的一些系統調用(下)

〇、前言 本文將會結合源代碼談論 sleep、wakeup 這兩個系統調用。 一、sleep()系統調用 以下是sleep()函數源碼&#xff1a; // Atomically release lock and sleep on chan. // Reacquires lock when awakened. void sleep(void *chan, struct spinlock *lk) {struct pro…

無線且列窄圖片如何轉excel?

寫此文原因&#xff1a;圖片要轉excel&#xff0c;這放以前&#xff0c;是不能實現的功能&#xff0c;但隨著人工智能的蓬勃發展&#xff0c;人們已克服了這一難題&#xff0c;但是&#xff0c;我們知道&#xff0c;要將圖片識別成excel&#xff0c;識別程序首先要先識別圖片中…

如何在小米路由器4A千兆版刷入OpenWRT并通過內網穿透工具實現公網遠程訪問

文章目錄 前言1. 安裝Python和需要的庫2. 使用 OpenWRTInvasion 破解路由器3. 備份當前分區并刷入新的Breed4. 安裝cpolar內網穿透4.1 注冊賬號4.2 下載cpolar客戶端4.3 登錄cpolar web ui管理界面4.4 創建公網地址 5. 固定公網地址訪問 前言 OpenWRT是一個高度模塊化、高度自…

交易歷史記錄20231206 記錄

昨日回顧&#xff1a; select top 10000 * from dbo.CODEINFO A left join dbo.全部&#xff21;股20231206010101 B ON A.CODE B.代碼 left join dbo.全部&#xff21;股20231206CONF D on A.CODED.代碼left join dbo.全部&#xff21;股20231206 G on A.CODEG.代碼 left…

解決前端跨域問題,后端解決方法

Spring CloudVue前后端分離項目報錯&#xff1a;Network Error&#xff1b;net::ERR_FAILED&#xff08;請求跨越&#xff09;-CSDN博客記錄自用

Kafka-快速實戰

Kafka介紹 ChatGPT對于Apache Kafka的介紹&#xff1a; Apache Kafka是一個分布式流處理平臺&#xff0c;最初由LinkedIn開發并于2011年開源。它主要用于解決大規模數據的實時流式處理和數據管道問題。 Kafka是一個分布式的發布-訂閱消息系統&#xff0c;可以快速地處理高吞吐…

阿里云國際基于CentOS系統鏡像快速部署Apache服務

阿里云輕量應用服務器提供了Windows Server系統鏡像和主流的Linux系統鏡像&#xff0c;您可以通過該類鏡像創建純凈、安全、穩定的運行環境。本文以CentOS 7.6系統鏡像為例&#xff0c;介紹如何快速配置Apache服務。 背景信息 注意&#xff0c;阿里云國際通過corebyt注冊并充…

使用rawpy.imread讀取.RAW格式數據和.dng格式數據(附代碼)

.dng格式是一個更兼容、更高效的RAW格式。如果需要在不同軟件之間交換RAW文件&#xff0c;或者需要在軟件中進行大量編輯&#xff0c;那么.dng格式是一個不錯的選擇。 目錄 一、 .dng格式數據和.RAW格式數據二、 .dng格式數據和.RAW格式數據區別三、安裝rawpy包四、讀取.dng格式…

Flask應用基礎入門總結

【1】使用migrate方式進行數據庫連接 使用migrate方式進行數據庫連接需要在終端分別運行三行代碼&#xff1a; #init&#xff08;運行一次即可&#xff09;&#xff08;此db為自己設置的連接數據庫的對象,可以修改&#xff09; flask db init #&#xff08;將orm模型生成遷移…

從零開始搭建企業管理系統(四):集成 Knife4j

集成 Knife4j 前言Knife4j是什么集成 Knife4j引入 pom 依賴添加基礎配置啟動程序測試完善文檔信息編寫配置類修改 UserController修改 UserEntity修改 BaseEntity 文檔效果圖swagger 界面knife4j 界面 前言 前面一小節我們使用postman來進行接口的調試&#xff0c;如果接口一多…

游戲王的題解

目錄 原題&#xff1a; 時間&#xff1a;1s 空間&#xff1a;256M 題目描述 輸入格式 輸出格式 樣例輸入 樣例輸出 題目大意&#xff1a; 主要思路&#xff1a; dp轉移&#xff1a; dp初始化&#xff1a; 代碼&#xff1a; 原題&#xff1a; 時間&#xff1a;1s …

springboot集成knife4j詳細教程

使用原生的swagger作為接口文檔&#xff0c;功能不夠強大&#xff0c;并且默認的ui比較簡陋&#xff0c;不符合大眾審美。所以實際開發中推薦使用knife4j對swagger進行增強。knife4j的地址&#xff1a;https://gitee.com/xiaoym/knife4j 基本使用 想要使用knife4j非常簡單&…

深入學習Redis:從入門到實戰

Redis快速入門 1.初識Redis1.1.認識NoSQL1.1.1.結構化與非結構化1.1.2.關聯和非關聯1.1.3.查詢方式1.1.4.事務1.1.5.總結 1.2.認識Redis1.3.安裝Redis1.3.1.依賴庫1.3.2.上傳安裝包并解壓1.3.3.啟動1.3.4.默認啟動1.3.5.指定配置啟動1.3.6.開機自啟 1.4.Redis桌面客戶端1.4.1.R…

【VS Code開發】使用Live Server搭建MENJA小游戲并發布至公網遠程訪問

文章目錄 前言1. 編寫MENJA小游戲2. 安裝cpolar內網穿透3. 配置MENJA小游戲公網訪問地址4. 實現公網訪問MENJA小游戲5. 固定MENJA小游戲公網地址 前言 本篇教程&#xff0c;我們將通過VS Code實現遠程開發MENJA小游戲&#xff0c;并通過cpolar內網穿透發布到公網&#xff0c;分…

C++ //習題3.8 寫出下面各邏輯表達式的值。設a=3,b=4,c=5。

C程序設計 &#xff08;第三版&#xff09; 譚浩強 習題3.8 習題3.8 寫出下面各邏輯表達式的值。設a3&#xff0c;b4&#xff0c;c5。 (1) a b > c && b c (2) a || b c && b - c (3) !(a > b) && !c || 1 (4) !(x a) && (y b…

FastAPI之響應狀態碼

使用FastAPI自定義響應狀態碼 FastAPI 是一個現代、快速的 web 框架&#xff0c;用于構建API服務&#xff0c;它允許你通過Python 3.6及以上版本進行編程。一個重要的API設計是返回合適的響應狀態碼&#xff0c;這可以使得客戶端理解服務端的處理結果。本教程將向你展示如何在…

推出 Amazon EC2 C7i 實例

亞馬遜云科技宣布全面推出由定制的第 4 代英特爾至強可擴展處理器&#xff08;代號為 Sapphire Rapids&#xff09;提供支持的 Amazon Elastic Compute Cloud (Amazon EC2) C7i 實例。這些定制處理器僅在亞馬遜云科技上可用&#xff0c;與其他云提供商使用的基于 x86 的同類英特…

Kafka事務是怎么實現的?Kafka事務消息原理詳解

目錄 一、Kafka事務性消息1.1 介紹Kafka事務性消息1.2 事務性消息的應用場景1.3 Kafka事務性消息的優勢 二、Kafka事務性消息的使用2.1 配置Kafka以支持事務性消息生產者配置消費者配置 2.2 生產者&#xff1a;發送事務性消息創建Kafka生產者開始事務發送消息提交或中止事務 2.…