当前位置: 代码网 > it编程>编程语言>Java > SpringBoot整合MD5加密完成注册和登录方式

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

2024年11月03日 Java 我要评论
md5是什么?md5(message digest algorithm 5)是一种常用的哈希算法,特点是生成的哈希值长度固定为128位(32位16进制表示)。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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com