SpringBoot整合MD5加密完成注册和登录方式
目录
- md5是什么?
- MD5 的主要特点包括
- MD5 的应用场景
- 市面上比较流行的加密方式
- 引入相关依赖
- 在src/main/resources/application.yml中添加配置
- 加密工具类
- 创建 User 实体类
- 创建 UserRepository 接口
- 创建 UserService 类
- 创建 UserController 类
- 测试 API
- 总结
md5是什么?
MD5(Message Digest Algorithm 5)是一种常用的哈希算法,特点是生成的哈希值长度固定为128位(32位16进制表示)。
MD5加密后的字符串是不可逆的,即无法通过加密后的字符串还原出原始字符串。
MD5 的主要特点包括
- 固定长度输出:无论输入数据的大小如何,输出始终为 128 位。
- 快速计算:MD5 算法在计算上相对简单,因此速度较快。
- 不可逆性:理论上,MD5 的输出不能被逆向推导回原始输入。
- 抗碰撞性:理想情况下,不同的输入数据不应产生相同的哈希值,但随着计算能力的提高,MD5 已被证明存在碰撞(即不同输入产生相同输出)的漏洞。
MD5 的应用场景
- 数据完整性校验:如文件下载时,提供 MD5 校验和以确保传输中未被篡改。
- 存储密码:将用户密码存储为 MD5 散列值,而不是明文密码,增加安全性。
- 数字签名:在某些情况下,可以使用 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> js<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(python'0'); // 补零 http://www.devze.com 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(Strjsing 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.phpbeans.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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论