ToolAct工具行动

MD5 哈希生成工具

在线 MD5 加密,支持 16 位和 32 位输出,大小写转换

输入内容
字符数: 0
转换结果
字符数: 0

格式设置

什么是 MD5 加密?

MD5(Message Digest Algorithm 5,消息摘要算法第五版)是一种广泛使用的密码散列函数,由美国密码学家罗纳德·李维斯特于 1991 年设计。MD5 可以将任意长度的数据映射为固定 128 位(16 字节)的散列值,通常表示为 32 个十六进制数字。 MD5 曾被广泛用于数据完整性校验、密码存储和数字签名等场景。但由于 2004 年我国密码学家王小云团队发现 MD5 存在碰撞漏洞,使得攻击者可以构造两个具有相同 MD5 值的不同数据,因此 MD5 已不再适合用于安全敏感场景。 MD5 输出格式分为两种:标准的 32 位(完整散列值)和截断的 16 位(取 32 位值的中间 16 位)。本工具支持两种格式输出,并可选择大写或小写显示。

如何使用

如何使用

  1. 在输入框中输入要加密的文本
  2. 选择输出格式:大写 32 位、小写 32 位、大写 16 位或小写 16 位
  3. MD5 值将自动计算并显示
  4. 点击「复制」按钮复制结果

输出格式说明

  • 需要完整的 MD5 摘要用于校验和、缓存键或遗留 API 字段时,使用 32 字符输出。
  • 仅当遗留系统明确要求完整摘要的中间 16 个字符时,才使用 16 字符输出。

大小写说明

  • 大写和小写 MD5 值包含相同的十六进制字节,仅显示格式不同。
  • 比较 MD5 值时,需匹配目标系统要求的大小写,避免出现误判不匹配。

使用场景

快速生成常见格式的文本 MD5粘贴一段文本,立即获得 32 位或中间 16 位的 MD5 摘要,支持大写和小写输出。这些格式在许多遗留 API、缓存键和数据库字段中仍然常见。文本在浏览器内通过标准的 128 位 MD5 压缩算法进行哈希计算,原始字符串不会离开当前标签页——在复现内部遗留校验和时非常实用。
调试时比对遗留签名当旧系统要求特定格式的 MD5 时,可以在 lower32、upper32、lower16 和 upper16 之间切换,快速判断不匹配是摘要本身的问题还是输出格式的问题。输入和输出的字符计数有助于发现意外的空格、末尾换行或 BOM 字节——同一个 UTF-8 字符串有无末尾 CRLF 会产生不同的哈希值。
在本地处理敏感文本MD5 计算完全在浏览器内对 UTF-8 编码的文本执行,内部标识符、测试字符串或临时密钥无需粘贴到外部哈希网站。MD5 适用于兼容性检查,不适合现代密码存储或高安全场景——在需要抗碰撞性时应使用 SHA-256。
从文件名或标识符生成缓存键将文件名、URL slug 或组合键粘贴到输入框,即可获得稳定的 32 位摘要作为 Redis、Memcached 或 CDN 清除列表的缓存键。中间 16 位格式也适用于存储成本敏感的短键空间,代价是碰撞空间约为 2^16——对于缓存键可以接受,但不适合用于身份标识。
确认两个系统间的校验和一致性在本地对相同的载荷进行哈希,然后与遗留导出、FTP 镜像或固件清单中的 MD5 进行比对。如果 32 位输出完全一致,说明字节级一致;如果有任何不匹配,则需要排查编码、换行符(CRLF 与 LF)、BOM 或文本编码差异,再报告传输错误。

技术原理

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 都不适合用作密码哈希。