MD5 密码加密
场景
用户注册或登录时,禁止明文存储密码到数据库,防止数据库泄露导致用户密码暴露。
MD5 特性
| 特性 | 说明 |
|---|---|
| 单向性 | MD5 只能加密,不能解密(没有反函数) |
| 无密钥 | 不需要密钥,只需传入原始字符串 |
| 可碰撞 | 不同字符串可能产生相同的 MD5 值 |
| 不安全 | 已被破解,不建议用于高安全场景 |
注意:MD5 加盐更安全,但这里介绍的是基础用法。
Java 实现
使用 Spring Boot 自带的 DigestUtils:
import org.springframework.util.DigestUtils;
// 密码加密
String password = "123456";
String encryptedPassword = DigestUtils.md5DigestAsHex(password.getBytes());
// 输出:e10adc3949ba59abbe56e057f20f883e(123456 的 MD5)
完整工具类
package com.sky.utils;
import org.springframework.util.DigestUtils;
public class PasswordEncoder {
/**
* MD5 加密
* @param password 原始密码
* @return 加密后的密码
*/
public static String encode(String password) {
return DigestUtils.md5DigestAsHex(password.getBytes());
}
/**
* 密码匹配验证
* @param rawPassword 原始密码(用户输入)
* @param encodedPassword 数据库中加密后的密码
* @return 是否匹配
*/
public static boolean matches(String rawPassword, String encodedPassword) {
// 将用户输入的密码加密后与数据库中的密码比对
return encode(rawPassword).equals(encodedPassword);
}
}
使用示例
// 注册时加密存储
String rawPassword = "user123456";
String encrypted = PasswordEncoder.encode(rawPassword);
// 存入数据库:encrypted = "7a7a1c9b0d8d..."
// 登录时验证
String inputPassword = "user123456";
boolean isValid = PasswordEncoder.matches(inputPassword, encrypted);
前端配合
前端通常也会对密码做一次 MD5(减轻明文传输风险):
import md5 from 'js-md5'
const password = 'user123456'
const encrypted = md5(password)
// 发送给后端
axios.post('/login', { username: 'tom', password: encrypted })
注意事项
- 不要仅用 MD5:纯 MD5 容易被彩虹表破解
- 推荐方案:
- BCrypt(推荐)
- SHA-256 + 加盐
- Argon2
- 用户无法找回密码:只能重置(因为 MD5 无法解密)