文件 MD5 校验工具
计算文件的 MD5 哈希值,验证文件完整性
拖拽文件到此处
支持任意文件类型和大小
什么是文件 MD5?
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希算法,可将任意文件内容映射为 128 位(32 个十六进制字符)的固定长度摘要。文件内容任何微小的变化都会导致完全不同的 MD5 值。文件 MD5 校验工具常用于验证文件完整性,确保文件在传输或下载过程中未被篡改或损坏。 安全相关结果不能孤立判断,还要结合密钥、使用场景、算法选择和可信来源一起评估。
使用方法
使用步骤
- 点击上传区域或将文件拖到页面上
- 点击「计算 MD5」按钮
- 等待计算完成,查看 MD5 值
- 可在验证区域输入已知 MD5 值进行比对
验证限制
- MD5 适合用于快速文件识别,但其抗碰撞能力不足,不适用于安全敏感的验证场景。
- 下载或发布版本时,请从可信来源比对哈希值,并优先使用 SHA-256。
使用场景
技术原理
MD5 是 RFC 1321(Ron Rivest,1992)定义的消息摘要算法 5,输出 128 位 / 16 字节摘要,以 32 个十六进制字符显示。算法采用 Merkle-Damgård 结构:输入先做填充,使比特长度对 512 取模为 448(先添加一个 1 比特再补 0),随后以小端 64 位整数附加原始长度,再切成 512 位的分组。每个分组更新一个 128 位的内部状态(A、B、C、D),初始值为 A = 0x67452301、B = 0xEFCDAB89、C = 0x98BADCFE、D = 0x10325476;按 4 组 ×16 共 64 轮迭代,每轮使用按位函数 F(x,y,z) = (x AND y) OR ((NOT x) AND z)、G(x,y,z) = (x AND z) OR (y AND (NOT z))、H(x,y,z) = x XOR y XOR z、I(x,y,z) = y XOR (x OR (NOT z)),配合常量 T[i] = floor(2^32 * |sin(i+1)|) 与左循环移位。最终状态以小端拼接即为摘要。空输入的 MD5 为 d41d8cd98f00b204e9800998ecf8427e,常用作管线自检。 浏览器不通过 crypto.subtle 提供 MD5(W3C Web Crypto 规范因碰撞攻击有意省略 MD5),所以本工具使用纯 JavaScript 实现的 MD5 在浏览器内完成计算。文件以 ArrayBuffer 形式读入内存,一次性算出 16 字节摘要并渲染为 32 个小写十六进制字符。计算运行在主线程,因此对多 GB 大文件做哈希会持续占用主线程直到结束;非常大的文件建议改用从磁盘流式读取的桌面工具。 MD5 在抗碰撞性上已被打破。王小云、于红波在 2004 年(CRYPTO 2005 发表)公布了首个可实用的碰撞攻击,将碰撞代价降到约 2^39 次运算。2008 年 Sotirov 等人利用选择前缀碰撞伪造了一张恶意中间 CA 证书;2012 年 Flame 国家级恶意软件使用此前未公开的选择前缀 MD5 碰撞,伪造了 Microsoft Terminal Server Licensing 代码签名证书。NIST 在 2011 年的 SP 800-131A 中禁止把 MD5 用于数字签名;CMU CERT 漏洞通告 VU#836068 称 MD5「不适合再使用」。MD5 仍可用于偶发损坏检测(哪怕翻转一位也会通过雪崩效应改变约 64 比特输出)和受信输入下的重复文件检测,但不要用于攻击者可控制或预测输入的场景。
- MD5 产生 128 位 / 16 字节的摘要,编码为 32 个小写十六进制字符;在 RFC 1321(Rivest,1992)中定义。
- 初始状态常量 A = 0x67452301、B = 0xEFCDAB89、C = 0x98BADCFE、D = 0x10325476;64 轮分四组各 16 轮,使用 F/G/H/I 位函数和轮常量 T[i] = floor(2^32 * |sin(i+1)|)。
- 空输入的 MD5 为 d41d8cd98f00b204e9800998ecf8427e——快速检查哈希管道是否返回有效摘要的简便方法。
- 浏览器不通过 crypto.subtle 提供 MD5(W3C Web Crypto 有意省略),本工具使用纯 JavaScript 实现的 MD5:把文件读为 ArrayBuffer,一次性计算 16 字节摘要,并渲染为 32 个小写十六进制字符。
- 内存占用:整个文件会一次性读入一个 ArrayBuffer 后再哈希,因此多 GB 文件需要相应大小的标签页内存;超过浏览器标签可承载的文件请改用从磁盘流式读取的桌面工具(md5sum、certutil -hashfile、Get-FileHash)。
- 碰撞攻击:王小云和于红波(2004)约 2^39 次运算;Sotirov 等(2008)选择前缀碰撞用于伪造恶意 CA 证书;Flame 恶意软件(2012)使用选择前缀碰撞伪造微软代码签名证书。
- NIST SP 800-131A 于 2011 年禁止将 MD5 用于数字签名;MD5 仅适用于非对抗性完整性检查和重复检测——当校验和涉及信任时请切换到 SHA-256 或更强算法。
示例
空文件 MD5(公认常量)
文件: empty.txt(0 字节)
MD5: d41d8cd98f00b204e9800998ecf8427e
这是空输入的 MD5 -> 用来快速验证哈希流程是否正常工作。
(来自 RFC 1321 中针对空字符串的标准向量。)校验下载的安装包
文件:setup.bin(3 字节,内容:abc)
计算 MD5:900150983cd24fb0d6963f7d28e17f72
厂商 MD5:900150983cd24fb0d6963f7d28e17f72
一致 -> 文件复制或下载正确。
不一致 -> 重新下载,传输过程中字节已损坏。
(该 MD5 值来自 RFC 1321 中针对 3 字节输入 'abc' 的
标准向量。实际使用时换成真实安装包即可,算法输出
是确定性的。)对比两个版本的文档
report-v1.txt (0 字节) -> MD5:d41d8cd98f00b204e9800998ecf8427e
report-v2.txt (3 字节,内容:abc)
-> MD5:900150983cd24fb0d6963f7d28e17f72
哈希不同即内容不同。哪怕只改一个字符,MD5 也会完全不同,
这正是完整性校验的工作原理。
(两个值均为 RFC 1321 MD5 标准向量。)hello 字符串对比文件
MD5("hello") = 5d41402abc4b2a76b9719d911017c592
MD5("hello\n") = b1946ac92492d2347c6235b4d2611184
末尾换行会改变摘要:内容为 hello 但末尾不带 \n 的 hello.txt
对应第一行结果,末尾带 \n 的对应第二行。
这是与不同操作系统生成的 MD5 对比时常见的坑。常见问题
文件会上传到服务器吗?
不会。MD5 通过 File API 在浏览器中本地计算。文件字节会分块读入内存并完成哈希,全程不会离开你的设备。可以在计算时打开“网络”面板进行确认。
MD5 现在还安全吗?
在安全场景下不安全。MD5 自 2004 年起就已被攻破——碰撞可以快速构造,因此不能用于数字签名、密码存储或防篡改校验。它仍可作为快速校验和,用于检测下载错误、磁盘错误等意外损坏。
为什么有时看到的 MD5 是小写,有时是大写?
MD5 输出 128 位 = 16 字节 = 32 个十六进制字符。这些字符显示为大写还是小写,纯属表现层选择;底层字节完全相同,验证时应不区分大小写。
这里能哈希多大的文件?
现代桌面浏览器在内存耗尽前一般可处理数 GB。移动端浏览器更紧张,几百 MB 是常见上限。超大文件请用系统命令(Linux 下 md5sum、Windows 下 certutil -hashfile、macOS 下 md5),它们直接从磁盘流式读取。
为什么我算的 MD5 和别的工具不一样?
几乎都是输入差了一个字节:换行符不同(CRLF 与 LF)、UTF-8 BOM、末尾空白,或文件版本不一样。MD5 算法本身是确定性的,输入完全相同时,所有合规实现都会得到相同结果。
对文本算 MD5 和对文件算 MD5 有什么区别?
MD5 处理的是字节,不是字符。“对文本算 MD5”是先将字符串编码(通常是 UTF-8),再对得到的字节求哈希;“对文件算 MD5”则直接读取文件字节。同一字符串以 UTF-8 与 UTF-16 保存,得到的 MD5 不同。
可以用 MD5 检测重复文件吗?
可以,但要注意 MD5 已知存在碰撞,恶意构造者能造出两份不同却 MD5 相同的文件。对于排查照片、下载等意外重复,MD5 已经足够快也足够可靠。需要可信去重时请改用 SHA-256。