SpringBoot整合MD5加密完成注册和登录方式

 更新时间:2024年10月17日 14:34:22   作者:小疙瘩的编程之路  
MD5(MessageDigestAlgorithm5)是一种常见的哈希算法,用于生成固定长度(128位)的哈希值,主要应用于数据完整性校验和密码存储,MD5具有快速计算、不可逆性和抗碰撞性等特点,尽管存在碰撞漏洞,MD5仍广泛应用于文件下载校验和数字签名等场景

md5是什么?

MD5(Message Digest Algorithm 5)是一种常用的哈希算法,特点是生成的哈希值长度固定为128位(32位16进制表示)。

MD5加密后的字符串是不可逆的,即无法通过加密后的字符串还原出原始字符串。

MD5 的主要特点包括

  1. 固定长度输出:无论输入数据的大小如何,输出始终为 128 位。
  2. 快速计算:MD5 算法在计算上相对简单,因此速度较快。
  3. 不可逆性:理论上,MD5 的输出不能被逆向推导回原始输入。
  4. 抗碰撞性:理想情况下,不同的输入数据不应产生相同的哈希值,但随着计算能力的提高,MD5 已被证明存在碰撞(即不同输入产生相同输出)的漏洞。

MD5 的应用场景

  1. 数据完整性校验:如文件下载时,提供 MD5 校验和以确保传输中未被篡改。
  2. 存储密码:将用户密码存储为 MD5 散列值,而不是明文密码,增加安全性。
  3. 数字签名:在某些情况下,可以使用 MD5 生成数据的数字签名。

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

1. AES (Advanced Encryption Standard)

  • 类型:对称加密
  • 用途:数据加密,广泛应用于文件加密、VPN、数据库等。
  • 特性:安全性高,效率快,支持128、192、256位密钥。

2. RSA (Rivest-Shamir-Adleman)

  • 类型:非对称加密
  • 用途:数据加密和数字签名,常用于安全通信(例如SSL/TLS)。
  • 特性:基于大数分解的难题,密钥长度通常为2048位或以上。

3. ECC (Elliptic Curve Cryptography)

  • 类型:非对称加密
  • 用途:数据加密和数字签名,特别是在资源受限的设备上。
  • 特性:相对于RSA,提供同样安全性但使用更短的密钥。

4. Blowfish 和 Twofish

  • 类型:对称加密
  • 用途:数据保护,广泛用于软件和硬件加密。
  • 特性:速度快,密钥长度可变,Blowfish支持32到448位密钥,而Twofish支持128、192、256位密钥。

5. 3DES (Triple DES)

  • 类型:对称加密
  • 用途:数据加密,曾广泛用于金融行业。
  • 特性:对每个数据块执行三次DES加密,但相较于AES较为过时。

6. SHA (Secure Hash Algorithm)

  • 类型:散列函数
  • 用途:数据完整性验证,常用于数字签名和密码存储。
  • 特性:包括SHA-1、SHA-256等,SHA-256是目前最常用的版本。

引入相关依赖

<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 内存数据库连接 URL
    driver-class-name: org.h2.Driver # H2 驱动类
    username: sa # 数据库用户名
    password: '' # 数据库密码(默认为空)
  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"); // 创建 MD5 实例
            byte[] messageDigest = md.digest(input.getBytes()); // 获取加密后的字节数组
            StringBuilder hexString = new StringBuilder();
            for (byte b : messageDigest) {
                String hex = Integer.toHexString(0xff & b); // 转换为十六进制字符串
                if (hex.length() == 1) hexString.append('0'); // 补零
                hexString.append(hex);
            }
            return hexString.toString(); // 返回十六进制字符串
        } catch (Exception e) {
            throw new RuntimeException("MD5 encryption error", e); // 抛出运行时异常
        }
    }
}

创建 User 实体类

package com.example.model;

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

@Entity // 标记该类为 JPA 实体类
public class User {
    @Id // 标记为主键
    @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;
    }
}

创建 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); // 根据用户名查找用户
}

创建 UserService 类

@Service // 标记为服务类,供 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(); // 创建新的用户实例
        user.setUsername(username); // 设置用户名
        user.setPassword(MD5Util.md5(password)); // 使用工具类进行 MD5 加密
        return userRepository.save(user); // 保存用户到数据库
    }

    // 用户登录方法
    public boolean login(String username, String password) {
        User user = userRepository.findByUsername(username); // 查找用户
        // 检查用户是否存在及密码是否匹配
        return user != null && user.getPassword().equals(MD5Util.md5(password));
    }
}

创建 UserController 类

package com.example.controller;

import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

// 控制器类,处理用户相关请求
@RestController
@RequestMapping("/api/users") // 设置请求路径前缀
public class UserController {
    @Autowired // 自动注入 UserService
    private UserService userService;

    // 用户注册接口
    @PostMapping("/register")
    public String register(@RequestParam String username, @RequestParam String password) {
        userService.register(username, password); // 调用注册服务
        return "User registered!"; // 返回注册成功信息
    }

    // 用户登录接口
    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        // 调用登录服务并返回结果
        return userService.login(username, password) ? "Login successful!" : "Login failed!";
    }
}

测试 API

使用Postman测试或者ApiPost

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot集成第三方jar快速实现微信、支付宝等支付场景

    Springboot集成第三方jar快速实现微信、支付宝等支付场景

    这篇文章主要介绍了Springboot集成第三方jar快速实现微信、支付宝等支付场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 一次诡异的full gc查找问题全过程

    一次诡异的full gc查找问题全过程

    这篇文章主要给大家分享介绍了一次诡异的full gc查找问题全部过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧啊
    2018-11-11
  • java基础的详细了解第二天

    java基础的详细了解第二天

    这篇文章对Java编程语言的基础知识作了一个较为全面的汇总,在这里给大家分享一下。需要的朋友可以参考,希望能给你带来帮助
    2021-08-08
  • 详解Java中接口的定义与实例代码

    详解Java中接口的定义与实例代码

    这篇文章主要介绍了详解Java中接口的定义与实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • RestTemplate响应中如何获取输入流InputStream

    RestTemplate响应中如何获取输入流InputStream

    这篇文章主要介绍了RestTemplate响应中如何获取输入流InputStream问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 一文带你熟练掌握Java中的日期时间相关类

    一文带你熟练掌握Java中的日期时间相关类

    我们在开发时,除了数字、数学这样的常用API之外,还有日期时间类,更是会被经常使用,比如我们项目中必备的日志功能,需要记录异常等信息产生的时间,本文就带各位来学习一下相关的日期时间类有哪些
    2023-05-05
  • JVM工作原理和工作流程简述

    JVM工作原理和工作流程简述

    这篇文章主要介绍了关于JVM工作原理简述,主要弄清楚jvm运行的来龙去脉,感兴趣的可以一起来了解一下
    2020-07-07
  • java 集合工具类Collections及Comparable和Comparator排序详解

    java 集合工具类Collections及Comparable和Comparator排序详解

    这篇文章主要介绍了java集合工具类Collections及Comparable和Comparator排序详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • 简单了解Java中多态的基础知识

    简单了解Java中多态的基础知识

    这篇文章主要介绍了简单了解Java中的多态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Quarkus中filter过滤器跨域cors问题解决方案

    Quarkus中filter过滤器跨域cors问题解决方案

    这篇文章主要为大家介绍了Quarkus中filter过滤器跨域cors问题的解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02

最新评论