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使用场景
MD5与其他哈希算法对比
MD5是常用哈希算法中速度最快、输出最短的,但其安全性保证最弱。下表比较了各算法的摘要大小、标准和适用场景。
| 算法 | 摘要大小 | 十六进制长度 | 标准 | 最佳用途 |
|---|---|---|---|---|
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums, non-security fingerprints |
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Legacy git commits (being replaced) |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, backup standard |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-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)——一个非对称组合器。这四个函数确保输入的每个比特都影响输出摘要,产生雪崩效应,使输入的微小变化导致结果哈希产生大量不可预测的变化。
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。
// 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"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())package main
import (
"crypto/md5"
"fmt"
)
func main() {
data := []byte("hello world")
hash := md5.Sum(data)
fmt.Printf("%x\n", hash)
// → 5eb63bbbe01eeed093cb22bb8f5acdc3
}# 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