logo
GeekFormat

MD5 哈希值

输入0 字符 · 0 字节
示例:
All Hashes (side-by-side)
Computed via Web Crypto API
MD5
32 hex
SHA-1
40 hex
SHA-256
64 hex
SHA-384
96 hex
SHA-512
128 hex

免费在线 MD5 哈希计算工具,支持文本、文件、批量逐行与 HMAC-MD5 四种模式。可选 UTF-8/Latin1 编码,大写输出与 8 位分组空格。⚠️ MD5 已不安全,请勿用于密码存储。

相关推荐

适用场景

  • 文件完整性校验:下载软件后计算 MD5,对比官网提供的指纹确认文件未损坏
  • 批量摘要生成:一次性生成多条配置文本的 MD5 摘要,用于快速对照表或发布记录
  • HMAC-MD5 签名:联调遗留系统时验证密钥与摘要结果(仅用于兼容场景)
  • 数据去重分析:用 MD5 快速判断日志或数据中的重复条目
  • 缓存键生成:用 MD5 作为短唯一标识,用于缓存或索引系统
  • 学习研究:理解哈希算法原理,对比 MD5/SHA1/SHA256 的输出差异

功能特点

  • 四种计算模式:支持文本、文件、批量逐行与 HMAC-MD5,覆盖常见校验场景
  • UTF-8/Latin1 编码可选:切换字符编码以匹配不同系统的哈希输入
  • 大写输出与 8 位分组:MD5 结果可切换大写格式,并按 8 位一组插入空格方便阅读
  • 文件分片哈希:大文件采用增量读取计算,避免内存溢出,界面始终流畅
  • 批量逐行对照:每行文本独立计算,输出「原文 → 哈希值」对照表
  • 一键复制结果:哈希值可直接复制到剪贴板

使用方法

  1. 选择模式:文本(输入字符串)、文件(拖拽上传)、批量逐行(每行独立计算)或 HMAC-MD5
  2. 设置参数:选择字符编码(UTF-8/Latin1)、大写输出、8 位分组空格
  3. 输入内容:输入文本、上传文件或粘贴批量内容
  4. 查看结果:复制哈希结果用于校验、发布说明或脚本使用

常见问题

MD5 常用于哪些场景?

MD5 常用于文件完整性校验(如下载包验证)、快速摘要生成、历史系统兼容、缓存键、数据去重等非安全场景。MD5 输出 128 位(32 位十六进制字符),计算速度快,适合对安全性要求不高的校验场景。

MD5 和 SHA256 有什么区别?

MD5 输出 128 位(32 位 Hex),SHA256 输出 256 位(64 位 Hex)。MD5 更快但已被破解;SHA256 未发现实际碰撞攻击,是现代安全场景的首选。

SHA256 工具

MD5 为什么不适合密码存储?

MD5 计算速度极快,现代 GPU 每秒可计算数十亿次,且无盐值保护容易被彩虹表破解。密码存储应使用 bcrypt、scrypt 或 Argon2 等慢速哈希算法。

密码生成器

MD5 已被破解,还能用吗?

安全场景(数字签名、密码存储、TLS 证书)绝对不能用。但非安全场景(文件校验防 corruption、数据去重、缓存键)中 MD5 仍然可用,因为攻击者没有动机制造碰撞。

MD5 哈希值能被解密吗?

MD5 是单向哈希,理论上不可解密。但通过彩虹表和暴力破解,常见弱密码可以在秒级被找到。这就是为什么不能用 MD5 存密码。

大文件哈希会卡吗?

不会。工具采用分片增量读取,不把整个文件加载到内存,即使数 GB 文件也能流畅计算,界面始终响应。

HMAC-MD5 是什么?和普通 MD5 有什么区别?

HMAC-MD5 是基于 MD5 的消息认证码算法,需要一个密钥作为输入,用于验证消息完整性和真实性。即使 MD5 本身有碰撞问题,HMAC-MD5 在密钥未知的情况下仍然安全(但仍建议迁移到 HMAC-SHA256)。

HMAC 生成器

什么是 MD5?

MD5(Message-Digest Algorithm 5)是由 Ronald Rivest 于 1991 年设计的 128 位哈希函数(RFC 1321),可将任意长度输入转换为固定 32 位十六进制指纹。MD5 曾广泛应用于数字签名、证书验证和密码存储,但 2004 年王小云团队首次演示碰撞攻击,2008 年 Flame 恶意软件利用 MD5 碰撞伪造了 CA 证书,2024 年新研究演示了原像攻击。

**MD5 的安全性状态**:NIST 于 2011 年在 SP 800-131A 中正式废弃 MD5 用于数字签名和安全场景。但 MD5 在非安全场景仍有用武之地:文件完整性校验(验证下载是否损坏)、数据去重、缓存键、日志分析。判断标准:攻击者是否有动机和能力制造碰撞?如果没有,MD5 的速度优势反而是优点。

**MD5 为什么不应用于密码存储**:MD5 计算极快,现代 GPU 可每秒计算数十亿次,配合彩虹表可秒破常见密码。密码存储必须使用 bcrypt、scrypt 或 Argon2 等「慢速哈希」算法——这些算法有可配置的工作因子,使暴力破解成本极高。

**HMAC-MD5 的安全性**:虽然纯 MD5 已被破解,但 HMAC-MD5(基于密钥的哈希消息认证码)在密钥未知的情况下仍然安全,因为 HMAC 的构造方式不直接依赖哈希函数的碰撞抗性。不过仍建议新系统迁移到 HMAC-SHA256。

工具使用纯 JavaScript 实现 MD5 计算(Web Crypto API 已不支持 MD5),所有计算在浏览器本地完成,文件采用分片增量读取不上传服务器。打开开发者工具网络面板可验证零外网请求。

术语表

哈希函数(Hash Function)
将任意长度输入映射为固定长度输出的数学函数。好的哈希函数具备单向性(无法从输出反推输入)、抗碰撞性(难找两个不同输入产生相同输出)和雪崩效应(输入微小变化导致输出完全不同)。
碰撞攻击(Collision Attack)
找到两个不同的输入产生相同的哈希输出。MD5 的碰撞攻击已于 2004 年被王小云团队实现,可在数秒内生成碰撞对,导致数字签名可被伪造。
原像攻击(Preimage Attack)
给定一个哈希输出,找到一个能产生该输出的输入。比碰撞攻击更难,但 MD5 的原像抗性已于 2024 年被新研究大幅削弱。
彩虹表(Rainbow Table)
预先计算好的哈希值→原文映射表,用于快速破解弱密码哈希。加盐(salt)可以防御彩虹表攻击。
HMAC(Hash-based Message Authentication Code)
基于哈希函数的消息认证码,使用密钥对消息进行认证,防止数据被篡改。HMAC-MD5 和 HMAC-SHA256 是常见变体。HMAC 生成器
bcrypt
专为密码存储设计的慢速哈希算法,内置盐值和可调整的工作因子(cost factor),使暴力破解成本极高。是密码存储的推荐算法之一。
Checksum(校验和)
用于验证数据完整性的小型固定值。MD5、SHA-1、SHA-256 都常用作校验和,通过比对哈希值判断文件是否在传输中损坏。
雪崩效应(Avalanche Effect)
输入微小变化(哪怕改一个比特)导致输出哈希值发生剧烈且不可预测的变化。MD5 虽然存在碰撞攻击,但其雪崩效应仍然良好,这也是它在非安全校验场景仍然可用的原因。
RFC 1321
MD5 算法的官方标准文档,由 Ronald Rivest 于 1992 年提交给 IETF,详细描述了 MD5 的算法步骤和测试用例。
分片哈希(Chunked Hashing)
处理大文件时,不一次性加载整个文件到内存,而是分块读取并增量更新哈希状态。本工具对大文件采用分片哈希技术,避免内存溢出和界面卡顿。

常见哈希算法对比

算法输出位数Hex长度安全性速度推荐用途
MD5128位32字符❌ 已破解(碰撞/原像)极快文件校验、去重、缓存键
SHA-1160位40字符❌ 碰撞攻击(2017)Git、旧系统兼容
SHA-256256位64字符✅ 安全中等数字签名、证书、区块链
SHA-512512位128字符✅ 安全快(64位CPU)高安全场景、密码派生
bcrypt-60字符✅ 密码专用慢(可调)密码存储

MD5 安全事件时间线

年份事件影响
1991Ron Rivest 设计 MD5(RFC 1321)替代 MD4,成为主流哈希算法
1996首次发现 MD5 伪碰撞缺陷学术界开始质疑 MD5 安全性
2004王小云团队演示 MD5 碰撞攻击MD5 数字签名安全性被彻底打破
2008Flame 恶意软件利用 MD5 碰撞伪造 CA 证书NIST 正式废弃 MD5 用于数字签名
2011NIST SP 800-131A 正式禁止 MD5 安全用途美国政府系统全面停用 MD5
2024新原像攻击论文发布MD5 最后防线(原像抗性)被突破

Code Examples

JavaScript 中计算 MD5(使用 Web Crypto API 仅支持 SHA,MD5需第三方库)

// 注意:Web Crypto API 不直接支持 MD5(已废弃)
// 生产环境推荐使用 SHA-256 替代
async function sha256(message) {
  const msgBuffer = new TextEncoder().encode(message);
  const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
  const hashArray = Array.from(new Uint8Array(hashBuffer));
  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
sha256('Hello World').then(console.log);
// a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

// MD5 在 Node.js 中使用 crypto 模块
const crypto = require('crypto');
const md5 = crypto.createHash('md5').update('Hello World').digest('hex');
console.log(md5); // b10a8db164e0754105b7a99be72e3fe5

Python 中计算 MD5

import hashlib

# 计算文本 MD5
text = 'Hello World'
md5_hash = hashlib.md5(text.encode('utf-8')).hexdigest()
print(md5_hash)  # b10a8db164e0754105b7a99be72e3fe5

# 计算文件 MD5(适用于大文件,分片读取)
def md5_file(filepath, chunk_size=8192):
    md5 = hashlib.md5()
    with open(filepath, 'rb') as f:
        while chunk := f.read(chunk_size):
            md5.update(chunk)
    return md5.hexdigest()

# HMAC-MD5
import hmac
hmac_md5 = hmac.new(b'secret-key', b'Hello World', hashlib.md5).hexdigest()
print(hmac_md5)

Java 中计算 MD5

import java.security.MessageDigest;
import java.nio.charset.StandardCharsets;
import javax.xml.bind.DatatypeConverter;

public class MD5Example {
    public static String md5(String input) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] hash = md.digest(input.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for (byte b : hash) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) throws Exception {
        System.out.println(md5("Hello World"));
        // b10a8db164e0754105b7a99be72e3fe5
    }
}

// 注意:Java 推荐使用 SHA-256 替代 MD5
// MessageDigest.getInstance("SHA-256")

Authoritative References