MD5 哈希生成工具
在线 MD5 加密,支持 16 位和 32 位输出,大小写转换
格式设置
什么是 MD5 加密?
MD5(Message Digest Algorithm 5,消息摘要算法第五版)是一种广泛使用的密码散列函数,由美国密码学家罗纳德·李维斯特于 1991 年设计。MD5 可以将任意长度的数据映射为固定 128 位(16 字节)的散列值,通常表示为 32 个十六进制数字。 MD5 曾被广泛用于数据完整性校验、密码存储和数字签名等场景。但由于 2004 年我国密码学家王小云团队发现 MD5 存在碰撞漏洞,使得攻击者可以构造两个具有相同 MD5 值的不同数据,因此 MD5 已不再适合用于安全敏感场景。 MD5 输出格式分为两种:标准的 32 位(完整散列值)和截断的 16 位(取 32 位值的中间 16 位)。本工具支持两种格式输出,并可选择大写或小写显示。
如何使用
如何使用
- 在输入框中输入要加密的文本
- 选择输出格式:大写 32 位、小写 32 位、大写 16 位或小写 16 位
- MD5 值将自动计算并显示
- 点击「复制」按钮复制结果
输出格式说明
- 需要完整的 MD5 摘要用于校验和、缓存键或遗留 API 字段时,使用 32 字符输出。
- 仅当遗留系统明确要求完整摘要的中间 16 个字符时,才使用 16 字符输出。
大小写说明
- 大写和小写 MD5 值包含相同的十六进制字节,仅显示格式不同。
- 比较 MD5 值时,需匹配目标系统要求的大小写,避免出现误判不匹配。
使用场景
技术原理
MD5(Message-Digest Algorithm 5)由 MIT 的 Ronald Rivest 于 1991 年设计,以 RFC 1321 发布,替代了已被攻破的 MD4。它是 1990 年代到 2000 年代的主力哈希算法:文件完整性校验、密码存储(不加盐,做法不当)、数字签名、恶意软件指纹,以及 `md5sum`、MySQL 的 `MD5()`、Git 旧版对象存储、`openssl dgst -md5` 等工具的默认摘要。输出为 128 位(16 字节),几乎总是显示为 32 个小写十六进制字符。设计遵循 Merkle-Damgard 结构:将消息填充到 512 位的倍数,附加 64 位小端长度,然后对每个 512 位块迭代压缩函数。128 位状态暴露在四个 32 位寄存器 A、B、C、D 中,初始化为固定常量(0x67452301、0xefcdab89、0x98badcfe、0x10325476——选取原则是「袖中无物」值:分别是 2、3、5、10 的平方根的小端表示)。 每个 512 位块被分成 16 个 32 位字 M[0..15],经过 4 轮各 16 步(共 64 步)。轮函数为 F = (X AND Y) OR (NOT X AND Z)、G = (X AND Z) OR (Y AND NOT Z)、H = X XOR Y XOR Z、I = Y XOR (X OR NOT Z);每步将一个轮函数、一个消息字、一个轮常量 T[i] = floor(2^32 · |sin(i+1)|) 和一个步特定的左旋转组合,然后将结果加回状态。4 轮的设计意图:第 1 轮快速且非线性,第 2 轮可并行化,第 3 轮混合更激进,第 4 轮以强扩散收尾。最终状态即为整条消息的 MD5;这使得 MD5 在量子计算之前是一种单向函数。 崩塌:抗碰撞性已被攻破,这是密码学用途中唯一重要的指标。Wang 等人在 2004 年发表了完整的碰撞攻击(后续攻击将碰撞搜索缩减到 PC 上几小时)。2008 年研究人员利用 MD5 碰撞伪造了合法 CA 证书(Stevens 等人的「选择前缀碰撞」攻击),2012 年 Flame 恶意软件利用一个未公开的 MD5 碰撞伪造了微软代码签名证书。2004 年的论文将碰撞搜索空间从 2^64 降到约 2^24,任何拥有几小时算力的攻击者都能产生两条 MD5 相同的消息。Flame 事件后,微软在 Authenticode 中明确禁用了 MD5;浏览器在 2014-2017 年间撤销了 MD5 签名的 TLS 证书;IETF 早已在 TLS、SSH 和 IPsec 中弃用 MD5。 现代 x86-64 笔记本的性能数据:MD5 每核哈希速度 400-700 MB/s(大输入时受内存带宽限制),SHA-256 为 200-300 MB/s,SHA-512 在 64 位 CPU 上因 64 位字运算而更快。对于密码哈希,无论吞吐量如何 MD5 都不合适——bcrypt/scrypt/Argon2id 才是可调节以对抗 GPU 加速的正确选择。单张 RTX 4090 上 Hashcat 的 MD5 基准约为 60 GH/s(每秒吉哈希),比同一 GPU 上的 SHA-256 快 7-8 倍。这个差距正是 MD5 危险的根源:GPU 几小时就能暴力遍历预计算表,而不是几年。Web Crypto 的 `crypto.subtle.digest('MD5', bytes)` 在 Chrome、Edge 和 Firefox 102+ 中以接近磁盘速度运行;较旧的浏览器回退到纯 JS 实现(SparkMD5 或页面内置),速度为 50-150 MB/s。RFC 1321 的测试向量:空字符串哈希为 d41d8cd98f00b204e9800998ecf8427e,'a' 为 0cc175b9c0f1b6a831c399e269772661,'abc' 为 900150983cd24fb0d6963f7d28e17f72。如果你的输出不匹配,问题几乎总是编码问题(将 JS 字符串而非 UTF-8 字节传给 JS MD5 实现),而非算法本身。
- Merkle-Damgard 结构使 MD5 易受长度扩展攻击:已知 H(secret || msg),攻击者可以在不知道 secret 的情况下计算 H(secret || msg || padding || extra)。因此 MD5(secret || message) 不是安全的 MAC——应使用 HMAC-MD5(RFC 2104)或 HMAC-SHA256,它们采用不同的结构(双密钥嵌套哈希)来抵抗此类攻击。
- 测试向量(RFC 1321):空字符串哈希为 d41d8cd98f00b204e9800998ecf8427e,'a' 为 0cc175b9c0f1b6a831c399e269772661,'abc' 为 900150983cd24fb0d6963f7d28e17f72。如果你的实现不输出这些值,问题几乎总是编码问题(将 JavaScript 字符串而非通过 TextEncoder 获得的 UTF-8 字节传给 JS MD5 实现),而非算法本身。
- 哈希速率:现代 x86-64 CPU 单核 MD5 约 400-700 MB/s,大输入时受内存带宽限制。SHA-256 慢约 30%,为 200-300 MB/s;SHA-512 在 64 位 CPU 上因操作 64 位字而更快。对于密码哈希,正确选择是 bcrypt(cost factor 12)/ scrypt / Argon2id,它们被故意设计为可调节的慢速算法以对抗 GPU 加速。
- 4 个轮函数 F、G、H、I 的命名刻意组成一句话('FiGiHI' / 'figi hi'),是 Rivest 的签名风格。每个函数都是纯位运算,采用不同的混合结构,使算法在密码分析下不会退化为线性或仿射系统。DES / AES 的 S-box 概念在 MD5 中不存在;安全性来自消息字扩展和旋转常量,而非替换表。
- 单张 RTX 4090 的 Hashcat 基准:MD5 约 60 GH/s(纯哈希),带盐 MD5 约 30 GH/s。同一 GPU 上 SHA-256 为 8 GH/s。7-8 倍的差距正是攻击者偏爱 MD5 的原因:GPU 几小时就能暴力遍历预计算表,而不是几年。对于需要抗离线攻击的场景,请使用 SHA-256、bcrypt 或 Argon2id。
- 「双重 MD5」(MD5(MD5(x)))在旧 PHP 和 MySQL 代码中时有出现,通常还加了盐。它对抗碰撞攻击没有帮助(MD5 的碰撞只需 O(1) 的额外工作即可成为 MD5(MD5()) 的碰撞),仅略微减慢原像搜索(约 2 倍因子)。现代密码哈希(RFC 9106 的 Argon2id、RFC 7914 的 scrypt、cost >= 12 的 bcrypt)是密码存储的唯一正确答案;如果你在现代密码列中看到 MD5,那就是一个 bug。
- 从 MD5 迁移:如果你维护的系统当前使用 MD5,正确的迁移方式是双写(读取时同时计算 MD5 和 SHA-256,新代码路径优先使用 SHA-256)经过一段弃用窗口期,然后在不再有依赖时移除 MD5。对于硬性要求 MD5 的遗留协议(NTLM、RADIUS 挑战响应、某些 Kerberos 模式),MD5 短期内不会消失——微软在 2010 年为 NTLM 打了 AES 补丁,但旧版本默认仍然开启以兼容,如果你有遗留 Windows 系统,应完全禁用 NTLMv1。
- 页面实现:当 Web Crypto 可用时(Chrome、Edge、Firefox 102+),使用 `crypto.subtle.digest('MD5', utf8Bytes)` 在原生代码中以接近磁盘速度运行。不可用时,使用纯 JS 实现(SparkMD5 0.7 或页面内置),速度为 50-150 MB/s。两者产生完全相同的输出,因此两个后端都通过测试向量验证。编码步骤为 `new TextEncoder().encode(str)`,始终输出 UTF-8 字节;不要将 JavaScript 字符串直接传给纯 JS MD5 实现,否则任何非 ASCII 输入都会产生错误的哈希值。
示例
空字符串与短文本
空字符串 -> d41d8cd98f00b204e9800998ecf8427e
hello -> 5d41402abc4b2a76b9719d911017c592
RFC: RFC 1321 附录 A.1 定义了这些测试向量大小写敏感
hello world -> 5eb63bbbe01eeed093cb22bb8f5acdc3
Hello -> 8b1a9953c4611296a827abf8c47804d7
HELLO -> eb61eead90e3b899c6bcbe27ac581660
说明:仅改动一个字符,哈希值就完全不同(雪崩效应)数字与标点
123456 -> e10adc3949ba59abbe56e057f20f883e
Hello, World! -> 65a8e27d8879283831b664bd8b7f0ad4
file.txt -> 3d8e577bddb17db339eae0b3d9bcf180
说明:任何标点或空白字符的变化都会得到完全不同的摘要为何不推荐用 MD5 做安全用途
碰撞攻击: 2004 年研究人员找到了构造两条 MD5 相同
但内容不同的消息的方法,这破坏了数字签名和
证书校验。
对安全场景请改用 SHA-256 或 SHA-3:
MD5: 128 位,抗碰撞性已被攻破(攻击切实可行)
SHA-256: 256 位,目前未发现可行碰撞
SHA-512: 512 位,安全冗余更大
NIST: 自 2005 年起 NIST 已废弃 MD5 用于密码学用途
用途: MD5 在文件完整性校验、去重和缓存键场景下仍然安全常见问题
什么是 MD5?
MD5(Message Digest 5,RFC 1321)是 Ron Rivest 于 1991 年发布的 128 位哈希函数。无论输入长度多少,输出始终为 32 位十六进制字符;只要输入有 1 比特变化,输出就会完全不同。它的速度很快,在现代 CPU 上可达每秒数百 MB。
MD5 还安全吗?
用于安全场景已经不安全。对 MD5 的碰撞攻击自 2004 年起就已具备实用性,选定前缀碰撞自 2007 年起也已实现。请勿将 MD5 用于数字签名、证书哈希、密码存储,或任何攻击者可控制输入的防篡改场景。
MD5 还能用来做什么?
用于检测意外损坏:下载校验、可信文件的简单去重、类似 ETag 的快速指纹等。许多厂商出于向后兼容仍会公布 MD5,通常会与 SHA-256 并列提供。
计算是在本地完成的吗?
是的。粘贴文本的 MD5 在浏览器中计算,不会上传或记录任何内容。计算时可在 Network 选项卡查看,确认没有网络请求。
为什么同一字符串在别处算出的 MD5 不一样?
几乎都是因为存在隐藏字符差异:UTF-8 BOM、行尾换行符、CRLF 与 LF 的差异,或者一边按 UTF-8 编码、另一边按 UTF-16 编码。MD5 算法本身在所有实现中都是完全确定的。
MD5 大写和小写是同一个值吗?
是的。输出的 128 位完全相同,大小写只是显示约定。校验时应当不区分大小写比较。
MD5 和 MD5(salt + password) 有什么区别?
对密码直接做 MD5 极易被彩虹表破解。加盐可阻止预计算表,但 MD5 对密码哈希来说速度仍然太快。密码请使用 bcrypt/scrypt/Argon2;无论加不加盐,MD5 都不适合用作密码哈希。