MD5哈希生成器

从任何文本生成MD5哈希

输入文本

本地运行 · 粘贴密钥安全无忧

MD5哈希

MD5哈希将显示在这里…

什么是MD5哈希?

MD5(消息摘要算法5)是一种密码哈希函数,无论输入大小如何,都能从任意输入生成固定128位(16字节)的摘要。MD5由Ronald Rivest于1992年发布,标准为RFC 1321,设计为MD4的更快继承者,迅速成为互联网上使用最广泛的哈希函数之一。该算法将输入以512位为一块进行处理,经过四轮每轮16次运算,每轮使用不同的非线性函数,最终生成32个字符的十六进制指纹。

哈希函数是一种单向变换:给定输入,可以立即计算出哈希值,但仅凭哈希值无法还原原始输入。即使输入只改变一个比特,也会产生完全不同的摘要——这一特性称为雪崩效应。MD5将无限的输入空间映射到固定的128位输出空间,因此从数学上讲,碰撞(两个不同输入产生相同哈希)必然存在,但安全的哈希函数使找到碰撞在计算上不可行。

自2004年起,研究人员已证明针对MD5的实际碰撞攻击,这意味着它不再被认为适用于数字签名、证书或任何需要抗碰撞性的场景。然而,MD5仍广泛用于非安全目的:验证下载文件的完整性、生成缓存键、去重内容以及从字符串创建确定性标识符。对于这些应用场景,该算法的速度和广泛的库支持使其成为实用的选择。 2008年,Marc Stevens等人发布了选择前缀碰撞攻击,即攻击者可以构造两个具有任意选定前缀且共享相同摘要的文档。这一技术在2008年混沌通信大会上通过构造伪造的证书颁发机构证书得到了演示。2012年,Flame恶意软件利用选择前缀碰撞伪造了微软代码签名证书,使恶意软件得以伪装成合法的Windows更新包。这些真实世界的漏洞利用证实,该算法在任何依赖信任锚的用途中已从密码学角度被彻底破解,不应在攻击者能够影响被哈希输入的场景中依赖它。

为什么使用这个MD5生成器?

无需安装任何软件或编写代码,即可即时生成MD5哈希。粘贴文本,实时获取32个字符的十六进制摘要。

即时哈希
输出随输入实时更新,无需点击按钮,无需等待——MD5摘要会随着您修改输入逐字符出现。
🔒
隐私优先处理
所有哈希运算均在浏览器中通过JavaScript本地执行。您的输入文本不会离开您的设备,也不会发送到任何服务器。
📋
一键复制
单击即可将哈希值复制到剪贴板。可在小写和大写十六进制输出之间切换,以匹配您系统所需的格式。
🔍
无需账号
无需注册,无需登录,无使用限制。打开页面即可立即开始哈希运算,支持任何现代浏览器的设备。

MD5使用场景

前端开发
为静态资源生成缓存清除哈希。将文件内容的MD5摘要附加到CSS和JavaScript URL中,使浏览器在内容更改时获取最新版本。
后端工程
从复杂的查询参数或请求体创建确定性缓存键。MD5哈希生成紧凑的固定长度键,适用于Redis、Memcached和CDN缓存层。
DevOps与CI/CD
通过比较MD5校验和来验证传输后的文件完整性。许多软件包注册表和制品仓库会在下载文件旁边发布MD5摘要以便快速验证。
质量保证与测试
比较API响应、数据库转储或配置文件的MD5哈希,以检测测试运行之间的意外变化,而无需对比完整内容。
数据工程
通过计算行内容的MD5哈希在ETL流水线中对记录去重。哈希相同的两行是去重候选项,可降低存储和处理成本。
学习与教育
通过实验哈希函数来理解单向变换、雪崩效应以及抗碰撞性对安全的重要性。MD5是最简单且广为人知的哈希算法,非常适合学习研究。

MD5与其他哈希算法对比

MD5是常用哈希算法中速度最快、输出最短的,但其安全性保证最弱。下表比较了各算法的摘要大小、标准和适用场景。

算法摘要大小十六进制长度标准最佳用途
MD5128 bits32 hex chars1992 / RFC 1321Checksums, non-security fingerprints
SHA-1160 bits40 hex chars1995 / RFC 3174Legacy git commits (being replaced)
SHA-256256 bits64 hex chars2001 / FIPS 180-4TLS certificates, blockchain, JWTs
SHA-384384 bits96 hex chars2001 / FIPS 180-4Government systems, higher security margin
SHA-512512 bits128 hex chars2001 / FIPS 180-4Digital signatures, HMAC with large keys
SHA-3256 bits64 hex chars2015 / FIPS 202Post-quantum readiness, backup standard
BLAKE3256 bits64 hex chars2020High-performance checksums, Merkle trees

MD5的工作原理

MD5通过Merkle-Damgård结构处理输入:将消息填充至512位的倍数,分割成块,每块经过四轮16次位运算处理,将输入与预计算的正弦导出常量混合。结果是一个128位的状态,成为最终摘要。

每轮对四个32位状态字(A、B、C、D)中的三个应用不同的非线性辅助函数。第1轮使用F(B,C,D) = (B AND C) OR (NOT B AND D)——一个按位条件选择器。第2轮使用G(B,C,D) = (B AND D) OR (C AND NOT D)——一个互补选择器。第3轮使用H(B,C,D) = B XOR C XOR D——一个奇偶校验函数。第4轮使用I(B,C,D) = C XOR (B OR NOT D)——一个非对称组合器。这四个函数确保输入的每个比特都影响输出摘要,产生雪崩效应,使输入的微小变化导致结果哈希产生大量不可预测的变化。

Input: "hello world"
MD5: 5eb63bbbe01eeed093cb22bb8f5acdc3
(128 bits = 16 bytes = 32 hex characters)

该算法分五个阶段进行:(1) 追加1比特,然后追加零,直到消息长度模512余448;(2) 将原始消息长度以64位小端整数追加;(3) 用固定常量初始化四个32位状态变量(A、B、C、D);(4) 通过64次运算处理每个512位块,使用四个非线性函数(F、G、H、I),每轮16次运算;(5) 将结果状态累加到运行总计中,以小端字节序输出最终128位哈希。

代码示例

如何在常用语言和环境中生成MD5哈希。注意,MD5在浏览器Web Crypto API中不可用——请使用库或Node.js。

JavaScript (Web Crypto — browser & Node.js)
// MD5 is not available in Web Crypto API (it only supports SHA-*)
// Use a library like 'js-md5' or the Node.js crypto module

// Node.js (built-in crypto)
const crypto = require('crypto')
const hash = crypto.createHash('md5').update('hello world').digest('hex')
console.log(hash) // → "5eb63bbbe01eeed093cb22bb8f5acdc3"

// With Unicode input
crypto.createHash('md5').update('cafe\u0301').digest('hex')
// → "4fad076bae205e95bec9dacea498e2ab"
Python
import hashlib

# Basic MD5 hash
result = hashlib.md5(b'hello world').hexdigest()
print(result)  # → "5eb63bbbe01eeed093cb22bb8f5acdc3"

# Hash a string (must encode to bytes first)
text = 'hello world'
hashlib.md5(text.encode('utf-8')).hexdigest()
# → "5eb63bbbe01eeed093cb22bb8f5acdc3"

# Hash a file
with open('file.bin', 'rb') as f:
    md5 = hashlib.md5()
    for chunk in iter(lambda: f.read(8192), b''):
        md5.update(chunk)
    print(md5.hexdigest())
Go
package main

import (
    "crypto/md5"
    "fmt"
)

func main() {
    data := []byte("hello world")
    hash := md5.Sum(data)
    fmt.Printf("%x\n", hash)
    // → 5eb63bbbe01eeed093cb22bb8f5acdc3
}
CLI (Linux / macOS)
# Using md5sum (Linux) or md5 (macOS)
echo -n "hello world" | md5sum
# → 5eb63bbbe01eeed093cb22bb8f5acdc3  -

# macOS
echo -n "hello world" | md5
# → 5eb63bbbe01eeed093cb22bb8f5acdc3

# Hash a file
md5sum package.json
# → a1b2c3d4e5f6...  package.json

# Using openssl (cross-platform)
echo -n "hello world" | openssl md5
# → MD5(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3

常见问题

MD5现在还安全吗?
对于安全敏感的应用场景(如数字签名、TLS证书或密码哈希)并不安全。自2004年起,实际碰撞攻击已被证明可行,而选择前缀碰撞攻击现在在普通硬件上可在数秒内完成。对于非安全用途(校验和、缓存键、内容去重),该算法仍是实用且广受支持的选择。
MD5与SHA-256有什么区别?
MD5算法生成128位(32个十六进制字符)摘要,且易受碰撞攻击。SHA-256生成256位(64个十六进制字符)摘要,目前没有已知的实际攻击。在相同硬件上,SHA-256比MD5慢约30-40%,但更大的安全裕度使其成为任何需要完整性验证且须抵御对抗性篡改的应用程序的默认选择。
能否将MD5哈希还原为原始输入?
不能。该哈希函数在设计上是单向的——它在哈希过程中会丢弃信息。然而,对于短或常见的输入,攻击者可以使用彩虹表(预先计算的哈希到明文映射)或暴力破解来找到原始输入。这就是为什么绝对不应将其用于密码存储。请使用bcrypt、scrypt或Argon2替代。
为什么不同工具对相同文本有时会产生不同的MD5哈希?
最常见的原因是编码差异。该算法操作的是字节,而非字符。字符串'hello'以UTF-8编码和以UTF-16或Latin-1编码时会产生不同的哈希值。另一个常见问题是末尾换行符:大多数shell中的echo会追加换行符(\n),除非使用echo -n。请始终验证正在被哈希的确切字节。
计算MD5哈希需要多长时间?
该算法速度极快。在现代硬件上,单个CPU核心的处理速度为3-6 GB/s。GPU每秒可计算数十亿次校验和。这种速度对文件验证是优势,但对密码哈希则是缺陷,后者更适合使用较慢的算法(bcrypt、Argon2),因为它们能有效抵御暴力破解攻击。
什么是MD5碰撞,为什么它很重要?
碰撞是指两个不同的输入产生相同的哈希摘要。2004年,王小云发布了首个针对MD5的实际碰撞攻击。到2012年,Flame恶意软件利用碰撞伪造了微软代码签名证书。如今,相同前缀碰撞可在一分钟内计算完成。这使该算法不适合任何依赖抗碰撞性的应用,例如数字签名或证书锁定。
文件校验应使用MD5还是CRC32?
对于文件完整性验证,MD5是比CRC32更好的选择。CRC32是一种32位纠错码,专为检测传输中的意外损坏而设计,而非防范蓄意篡改。其较小的输出空间意味着碰撞极易构造。MD5提供128位摘要,具有更强的意外碰撞抵抗力。对于对抗性场景(验证来自不可信来源的下载),请改用SHA-256。