最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合MD5加密完成注冊和登錄方式

 更新時間:2024年10月17日 14:34:22   作者:小疙瘩的編程之路  
MD5(MessageDigestAlgorithm5)是一種常見的哈希算法,用于生成固定長度(128位)的哈希值,主要應(yīng)用于數(shù)據(jù)完整性校驗和密碼存儲,MD5具有快速計算、不可逆性和抗碰撞性等特點,盡管存在碰撞漏洞,MD5仍廣泛應(yīng)用于文件下載校驗和數(shù)字簽名等場景

md5是什么?

MD5(Message Digest Algorithm 5)是一種常用的哈希算法,特點是生成的哈希值長度固定為128位(32位16進(jìn)制表示)。

MD5加密后的字符串是不可逆的,即無法通過加密后的字符串還原出原始字符串。

MD5 的主要特點包括

  1. 固定長度輸出:無論輸入數(shù)據(jù)的大小如何,輸出始終為 128 位。
  2. 快速計算:MD5 算法在計算上相對簡單,因此速度較快。
  3. 不可逆性:理論上,MD5 的輸出不能被逆向推導(dǎo)回原始輸入。
  4. 抗碰撞性:理想情況下,不同的輸入數(shù)據(jù)不應(yīng)產(chǎn)生相同的哈希值,但隨著計算能力的提高,MD5 已被證明存在碰撞(即不同輸入產(chǎn)生相同輸出)的漏洞。

MD5 的應(yīng)用場景

  1. 數(shù)據(jù)完整性校驗:如文件下載時,提供 MD5 校驗和以確保傳輸中未被篡改。
  2. 存儲密碼:將用戶密碼存儲為 MD5 散列值,而不是明文密碼,增加安全性。
  3. 數(shù)字簽名:在某些情況下,可以使用 MD5 生成數(shù)據(jù)的數(shù)字簽名。

市面上比較流行的加密方式

1. AES (Advanced Encryption Standard)

  • 類型:對稱加密
  • 用途:數(shù)據(jù)加密,廣泛應(yīng)用于文件加密、VPN、數(shù)據(jù)庫等。
  • 特性:安全性高,效率快,支持128、192、256位密鑰。

2. RSA (Rivest-Shamir-Adleman)

  • 類型:非對稱加密
  • 用途:數(shù)據(jù)加密和數(shù)字簽名,常用于安全通信(例如SSL/TLS)。
  • 特性:基于大數(shù)分解的難題,密鑰長度通常為2048位或以上。

3. ECC (Elliptic Curve Cryptography)

  • 類型:非對稱加密
  • 用途:數(shù)據(jù)加密和數(shù)字簽名,特別是在資源受限的設(shè)備上。
  • 特性:相對于RSA,提供同樣安全性但使用更短的密鑰。

4. Blowfish 和 Twofish

  • 類型:對稱加密
  • 用途:數(shù)據(jù)保護(hù),廣泛用于軟件和硬件加密。
  • 特性:速度快,密鑰長度可變,Blowfish支持32到448位密鑰,而Twofish支持128、192、256位密鑰。

5. 3DES (Triple DES)

  • 類型:對稱加密
  • 用途:數(shù)據(jù)加密,曾廣泛用于金融行業(yè)。
  • 特性:對每個數(shù)據(jù)塊執(zhí)行三次DES加密,但相較于AES較為過時。

6. SHA (Secure Hash Algorithm)

  • 類型:散列函數(shù)
  • 用途:數(shù)據(jù)完整性驗證,常用于數(shù)字簽名和密碼存儲。
  • 特性:包括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 控制臺
  datasource:
    url: jdbc:h2:mem:testdb # H2 內(nèi)存數(shù)據(jù)庫連接 URL
    driver-class-name: org.h2.Driver # H2 驅(qū)動類
    username: sa # 數(shù)據(jù)庫用戶名
    password: '' # 數(shù)據(jù)庫密碼(默認(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 實例
            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'); // 補零
                hexString.append(hex);
            }
            return hexString.toString(); // 返回十六進(jìn)制字符串
        } catch (Exception e) {
            throw new RuntimeException("MD5 encryption error", e); // 拋出運行時異常
        }
    }
}

創(chuàng)建 User 實體類

package com.example.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // 標(biāo)記該類為 JPA 實體類
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 // 自動注入 UserRepository
    private UserRepository userRepository;

    // 用戶注冊方法
    public User register(String username, String password) {
        // 檢查用戶名是否已存在
        if (userRepository.findByUsername(username) != null) {
            throw new RuntimeException("用戶名已存在"); // 拋出異常或返回錯誤信息
        }

        User user = new User(); // 創(chuàng)建新的用戶實例
        user.setUsername(username); // 設(shè)置用戶名
        user.setPassword(MD5Util.md5(password)); // 使用工具類進(jìn)行 MD5 加密
        return userRepository.save(user); // 保存用戶到數(shù)據(jù)庫
    }

    // 用戶登錄方法
    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)請求
@RestController
@RequestMapping("/api/users") // 設(shè)置請求路徑前綴
public class UserController {
    @Autowired // 自動注入 UserService
    private UserService userService;

    // 用戶注冊接口
    @PostMapping("/register")
    public String register(@RequestParam String username, @RequestParam String password) {
        userService.register(username, password); // 調(diào)用注冊服務(wù)
        return "User registered!"; // 返回注冊成功信息
    }

    // 用戶登錄接口
    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        // 調(diào)用登錄服務(wù)并返回結(jié)果
        return userService.login(username, password) ? "Login successful!" : "Login failed!";
    }
}

測試 API

使用Postman測試或者ApiPost

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot項目中定時任務(wù)的四種實現(xiàn)方式詳解

    Springboot項目中定時任務(wù)的四種實現(xiàn)方式詳解

    Spring的@Scheduled注解是一種非常簡單和便捷的實現(xiàn)定時任務(wù)的方式,通過在方法上添加@Scheduled注解,我們可以指定方法在特定的時間間隔或固定的時間點執(zhí)行,本文給大家介紹Springboot項目中定時任務(wù)的四種實現(xiàn)方式,感興趣的的朋友一起看看b
    2024-02-02
  • JDK14性能管理工具之Jconsole的使用詳解

    JDK14性能管理工具之Jconsole的使用詳解

    JConsole是JDK自帶的管理工具,在JAVA_HOME/bin下面,直接命令JConsole即可開啟JConsole。接下來通過本文給大家分享JDK14性能管理工具之Jconsole的使用,感興趣的朋友一起看看吧
    2020-05-05
  • springboot中使用undertow踩坑記(最新推薦)

    springboot中使用undertow踩坑記(最新推薦)

    這篇文章主要介紹了springboot中使用undertow踩坑記,springboot內(nèi)置類web中間件,將web服務(wù)器管理權(quán)交給了容器,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • java面向?qū)ο蠡A(chǔ)_final詳細(xì)介紹

    java面向?qū)ο蠡A(chǔ)_final詳細(xì)介紹

    本文將詳細(xì)介紹java final 對象的使用,需要了解更多的朋友可以參考下
    2012-11-11
  • Springboot整合freemarker 404問題解決方案

    Springboot整合freemarker 404問題解決方案

    這篇文章主要介紹了Springboot整合freemarker 404問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Java實現(xiàn)視頻初步壓縮和解壓的代碼示例

    Java實現(xiàn)視頻初步壓縮和解壓的代碼示例

    從攝像頭讀取每一幀的圖片,用一些簡單的方法將多張圖片信息壓縮到一份文件中(自定義的視頻文件),自定義解碼器讀取視頻文件,并將每幀圖片展示成視頻,本文主要介紹了Java實現(xiàn)視頻初步壓縮和解壓,需要的朋友可以參考下
    2023-10-10
  • 查看Java所支持的語言及相應(yīng)的版本信息

    查看Java所支持的語言及相應(yīng)的版本信息

    Java語言作為第一種支持國際化的語言,在Internet從一開始就具有其他語言無與倫比的國際化的本質(zhì)特性,查看Java所支持的語言及相應(yīng)的版本信息可以采用以下代碼進(jìn)行查詢
    2014-01-01
  • 將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀解析

    將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀解析

    這篇文章主要介紹了將Swagger2文檔導(dǎo)出為HTML或markdown等格式離線閱讀,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot項目刪除Bean或者不加載Bean的問題解決

    SpringBoot項目刪除Bean或者不加載Bean的問題解決

    文章介紹了在Spring Boot項目中如何使用@ComponentScan注解和自定義過濾器實現(xiàn)不加載某些Bean的方法,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-01-01
  • ELK搭建線上日志收集系統(tǒng)

    ELK搭建線上日志收集系統(tǒng)

    ELK日志收集系統(tǒng)進(jìn)階使用,本文主要講解如何打造一個線上環(huán)境真實可用的日志收集系統(tǒng),有了它,你就可以和去服務(wù)器上撈日志說再見了
    2022-07-07

最新評論

磴口县| 黑龙江省| 兰西县| 金寨县| 重庆市| 赤水市| 静乐县| 金阳县| 虎林市| 清徐县| 安新县| 淳化县| 莱西市| 景泰县| 灌阳县| 旺苍县| 肇东市| 石棉县| 罗城| 南丰县| 漠河县| 长子县| 潼南县| 中阳县| 雷州市| 正宁县| 汾阳市| 安国市| 乌恰县| 乌兰县| 疏勒县| 阿坝县| 铅山县| 克什克腾旗| 广昌县| 广州市| 衢州市| 福海县| 哈尔滨市| 台东县| 固原市|