← 返回文章列表

MD5 密码加密

javasecurity

用户密码禁止明文存储,MD5 特性、加盐与 DigestUtils 用法。

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 })

注意事项

  1. 不要仅用 MD5:纯 MD5 容易被彩虹表破解
  2. 推荐方案
    • BCrypt(推荐)
    • SHA-256 + 加盐
    • Argon2
  3. 用户无法找回密码:只能重置(因为 MD5 无法解密)