SpringBoot整合MD5加密完成注冊(cè)和登錄方式
md5是什么?
MD5(Message Digest Algorithm 5)是一種常用的哈希算法,特點(diǎn)是生成的哈希值長(zhǎng)度固定為128位(32位16進(jìn)制表示)。
MD5加密后的字符串是不可逆的,即無(wú)法通過(guò)加密后的字符串還原出原始字符串。
MD5 的主要特點(diǎn)包括
- 固定長(zhǎng)度輸出:無(wú)論輸入數(shù)據(jù)的大小如何,輸出始終為 128 位。
- 快速計(jì)算:MD5 算法在計(jì)算上相對(duì)簡(jiǎn)單,因此速度較快。
- 不可逆性:理論上,MD5 的輸出不能被逆向推導(dǎo)回原始輸入。
- 抗碰撞性:理想情況下,不同的輸入數(shù)據(jù)不應(yīng)產(chǎn)生相同的哈希值,但隨著計(jì)算能力的提高,MD5 已被證明存在碰撞(即不同輸入產(chǎn)生相同輸出)的漏洞。
MD5 的應(yīng)用場(chǎng)景
- 數(shù)據(jù)完整性校驗(yàn):如文件下載時(shí),提供 MD5 校驗(yàn)和以確保傳輸中未被篡改。
- 存儲(chǔ)密碼:將用戶密碼存儲(chǔ)為 MD5 散列值,而不是明文密碼,增加安全性。
- 數(shù)字簽名:在某些情況下,可以使用 MD5 生成數(shù)據(jù)的數(shù)字簽名。
市面上比較流行的加密方式
1. AES (Advanced Encryption Standard)
- 類型:對(duì)稱加密
- 用途:數(shù)據(jù)加密,廣泛應(yīng)用于文件加密、VPN、數(shù)據(jù)庫(kù)等。
- 特性:安全性高,效率快,支持128、192、256位密鑰。
2. RSA (Rivest-Shamir-Adleman)
- 類型:非對(duì)稱加密
- 用途:數(shù)據(jù)加密和數(shù)字簽名,常用于安全通信(例如SSL/TLS)。
- 特性:基于大數(shù)分解的難題,密鑰長(zhǎng)度通常為2048位或以上。
3. ECC (Elliptic Curve Cryptography)
- 類型:非對(duì)稱加密
- 用途:數(shù)據(jù)加密和數(shù)字簽名,特別是在資源受限的設(shè)備上。
- 特性:相對(duì)于RSA,提供同樣安全性但使用更短的密鑰。
4. Blowfish 和 Twofish
- 類型:對(duì)稱加密
- 用途:數(shù)據(jù)保護(hù),廣泛用于軟件和硬件加密。
- 特性:速度快,密鑰長(zhǎng)度可變,Blowfish支持32到448位密鑰,而Twofish支持128、192、256位密鑰。
5. 3DES (Triple DES)
- 類型:對(duì)稱加密
- 用途:數(shù)據(jù)加密,曾廣泛用于金融行業(yè)。
- 特性:對(duì)每個(gè)數(shù)據(jù)塊執(zhí)行三次DES加密,但相較于AES較為過(guò)時(shí)。
6. SHA (Secure Hash Algorithm)
- 類型:散列函數(shù)
- 用途:數(shù)據(jù)完整性驗(yàn)證,常用于數(shù)字簽名和密碼存儲(chǔ)。
- 特性:包括SHA-1、SHA-256等,SHA-256是目前最常用的版本。
引入相關(guān)依賴
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- H2 Database -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot Starter Test (可選) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>在src/main/resources/application.yml中添加配置
spring:
h2:
console:
enabled: true # 啟用 H2 控制臺(tái)
datasource:
url: jdbc:h2:mem:testdb # H2 內(nèi)存數(shù)據(jù)庫(kù)連接 URL
driver-class-name: org.h2.Driver # H2 驅(qū)動(dòng)類
username: sa # 數(shù)據(jù)庫(kù)用戶名
password: '' # 數(shù)據(jù)庫(kù)密碼(默認(rèn)為空)
jpa:
database-platform: org.hibernate.dialect.H2Dialect # 使用 H2 方言加密工具類
import java.security.MessageDigest;
public class MD5Util {
// MD5 加密方法
public static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5"); // 創(chuàng)建 MD5 實(shí)例
byte[] messageDigest = md.digest(input.getBytes()); // 獲取加密后的字節(jié)數(shù)組
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
String hex = Integer.toHexString(0xff & b); // 轉(zhuǎn)換為十六進(jìn)制字符串
if (hex.length() == 1) hexString.append('0'); // 補(bǔ)零
hexString.append(hex);
}
return hexString.toString(); // 返回十六進(jìn)制字符串
} catch (Exception e) {
throw new RuntimeException("MD5 encryption error", e); // 拋出運(yùn)行時(shí)異常
}
}
}創(chuàng)建 User 實(shí)體類
package com.example.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity // 標(biāo)記該類為 JPA 實(shí)體類
public class User {
@Id // 標(biāo)記為主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主鍵自增策略
private Long id; // 用戶 ID
private String username; // 用戶名
private String password; // 密碼
// Getter 和 Setter 方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}創(chuàng)建 UserRepository 接口
package com.example.repository;
import com.example.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
// UserRepository 接口,繼承 JpaRepository 提供基本的 CRUD 操作
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username); // 根據(jù)用戶名查找用戶
}創(chuàng)建 UserService 類
@Service // 標(biāo)記為服務(wù)類,供 Spring 管理
public class UserService {
@Autowired // 自動(dòng)注入 UserRepository
private UserRepository userRepository;
// 用戶注冊(cè)方法
public User register(String username, String password) {
// 檢查用戶名是否已存在
if (userRepository.findByUsername(username) != null) {
throw new RuntimeException("用戶名已存在"); // 拋出異?;蚍祷劐e(cuò)誤信息
}
User user = new User(); // 創(chuàng)建新的用戶實(shí)例
user.setUsername(username); // 設(shè)置用戶名
user.setPassword(MD5Util.md5(password)); // 使用工具類進(jìn)行 MD5 加密
return userRepository.save(user); // 保存用戶到數(shù)據(jù)庫(kù)
}
// 用戶登錄方法
public boolean login(String username, String password) {
User user = userRepository.findByUsername(username); // 查找用戶
// 檢查用戶是否存在及密碼是否匹配
return user != null && user.getPassword().equals(MD5Util.md5(password));
}
}創(chuàng)建 UserController 類
package com.example.controller;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
// 控制器類,處理用戶相關(guān)請(qǐng)求
@RestController
@RequestMapping("/api/users") // 設(shè)置請(qǐng)求路徑前綴
public class UserController {
@Autowired // 自動(dòng)注入 UserService
private UserService userService;
// 用戶注冊(cè)接口
@PostMapping("/register")
public String register(@RequestParam String username, @RequestParam String password) {
userService.register(username, password); // 調(diào)用注冊(cè)服務(wù)
return "User registered!"; // 返回注冊(cè)成功信息
}
// 用戶登錄接口
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {
// 調(diào)用登錄服務(wù)并返回結(jié)果
return userService.login(username, password) ? "Login successful!" : "Login failed!";
}
}測(cè)試 API
使用Postman測(cè)試或者ApiPost
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot常見登錄(注冊(cè))幾種實(shí)現(xiàn)過(guò)程
- Springboot集成JWT實(shí)現(xiàn)登錄注冊(cè)的示例代碼
- SpringBoot結(jié)合JWT實(shí)現(xiàn)用戶登錄、注冊(cè)、鑒權(quán)
- 基于SpringBoot和Vue3的博客平臺(tái)的用戶注冊(cè)與登錄功能實(shí)現(xiàn)
- SpringBoot+JWT實(shí)現(xiàn)注冊(cè)、登錄、狀態(tài)續(xù)簽流程分析
- SpringBoot實(shí)現(xiàn)簡(jiǎn)單的登錄注冊(cè)的項(xiàng)目實(shí)戰(zhàn)
- springboot+VUE實(shí)現(xiàn)登錄注冊(cè)
- SpringBoot實(shí)現(xiàn)登錄注冊(cè)常見問(wèn)題解決方案
- SpringBoot實(shí)現(xiàn)登錄注冊(cè)的三種基本方式
相關(guān)文章
Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式詳解
Spring的@Scheduled注解是一種非常簡(jiǎn)單和便捷的實(shí)現(xiàn)定時(shí)任務(wù)的方式,通過(guò)在方法上添加@Scheduled注解,我們可以指定方法在特定的時(shí)間間隔或固定的時(shí)間點(diǎn)執(zhí)行,本文給大家介紹Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式,感興趣的的朋友一起看看b2024-02-02
springboot中使用undertow踩坑記(最新推薦)
這篇文章主要介紹了springboot中使用undertow踩坑記,springboot內(nèi)置類web中間件,將web服務(wù)器管理權(quán)交給了容器,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
java面向?qū)ο蠡A(chǔ)_final詳細(xì)介紹
本文將詳細(xì)介紹java final 對(duì)象的使用,需要了解更多的朋友可以參考下2012-11-11
Springboot整合freemarker 404問(wèn)題解決方案
這篇文章主要介紹了Springboot整合freemarker 404問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Java實(shí)現(xiàn)視頻初步壓縮和解壓的代碼示例
從攝像頭讀取每一幀的圖片,用一些簡(jiǎn)單的方法將多張圖片信息壓縮到一份文件中(自定義的視頻文件),自定義解碼器讀取視頻文件,并將每幀圖片展示成視頻,本文主要介紹了Java實(shí)現(xiàn)視頻初步壓縮和解壓,需要的朋友可以參考下2023-10-10
查看Java所支持的語(yǔ)言及相應(yīng)的版本信息
Java語(yǔ)言作為第一種支持國(guó)際化的語(yǔ)言,在Internet從一開始就具有其他語(yǔ)言無(wú)與倫比的國(guó)際化的本質(zhì)特性,查看Java所支持的語(yǔ)言及相應(yīng)的版本信息可以采用以下代碼進(jìn)行查詢2014-01-01
將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀解析
這篇文章主要介紹了將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
SpringBoot項(xiàng)目刪除Bean或者不加載Bean的問(wèn)題解決
文章介紹了在Spring Boot項(xiàng)目中如何使用@ComponentScan注解和自定義過(guò)濾器實(shí)現(xiàn)不加載某些Bean的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01

