使用方法
- 上面的文本框里已经放好一段示例原文,它是 128 个 UTF-8 字节、28 个汉字;页面打开时结果区显示的就是它的摘要
2abfbed520e5a7ba625c59d23c768ad8。把内容换成你要校验的文本,结果随输入自动重算。 - 文本框里按 Ctrl + Enter(macOS 用 Cmd + Enter)可以立刻重算一次;Enter 仍然是换行。这一点对校验很关键:换行符本身也是被摘要的数据,如果工具把 Enter 抢去当快捷键,你就没法输入带换行的多行文本了。
- 「短哈希位数」默认 7,对齐 Git 提交号的简写习惯;可填 4~32 的整数,结果区会多出一行截断后的短哈希。截断只影响展示,完整摘要始终是 32 个十六进制字符。
- 「十六进制大小写」只改展示形式:本工具一律按小写计算,需要大写时切一下即可。和别的系统比对之前先统一大小写,否则
2abfbed…与2ABFBED…会被当成两个不同的值。 - 点「复制摘要」带走完整小写摘要;点「载入示例」还原样例;点「清空原文」清空内容。下方对照表旁边还有「加载更多」「复制对照表(TSV)」「导出 CSV(带 BOM)」三个按钮。
这个 MD5加密 工具能解决什么问题
一是核对下载与传输是否损坏。发布页给出 MD5 值、你本地算一遍比对,能挡住断点续传出错、FTP 文本模式把 CRLF 改成 LF、解压时丢字节这类问题。示例对照表里 hello 与 hello\r\n 的摘要分别是 5d41402abc4b2a76b9719d911017c592 和 af5597c29467a96523a70787c319f4db,一个换行差异就足以让校验失败。
二是定位「校验值对不上」的具体原因。这种情况九成不是算法错了,而是输入差了看不见的字符:行尾多一个空格、文件开头多了 UTF-8 BOM、从 Word 复制出来带了全角空格、同一个 é 有的是预组合有的是分解写法。页面下方的对照表把 24 种常见差异逐行列出摘要,拿你的实际值去对,很快就能锁定是哪一类。
三是和老系统对账。很多 2010 年前后建设的系统把用户口令、设备指纹、单据校验码存成 32 位 MD5 字符串。本页给出的是标准 RFC 1321 结果,可以直接用来复现历史数据、写数据迁移脚本。
四是看懂所有哈希算法的共同底座。定长输出、确定性、雪崩效应、单向性这四条性质,MD5 全部具备,SHA-256、bcrypt、Argon2 也建立在同一套思路上。先用最短的 MD5 把这几条性质看清楚,再去看更长的摘要会轻松得多。
这个 MD5加密 工具不做这些事:不做原文还原(摘要不可逆)、不评估口令强度、不识别一串十六进制字符到底是 MD5 还是别的算法的输出、不提供碰撞样本的构造能力。要判断一条已有口令被猜中的难易,请用页面底部的「密码力量检测」;要反查一段十六进制属于哪种摘要,请用「哈希值识别器」。
MD5 的算法原理与几个关键变量
它调用的算法是什么。MD5 由 Ron Rivest 于 1991 年设计并在 RFC 1321 中发布,输入是任意长度的字节串,输出固定 128 位。本页的实现在浏览器里用纯 JavaScript 按 RFC 1321 逐轮写出,没有调用任何第三方库;之所以不用浏览器的 Web Crypto 接口,是因为 Web Crypto 只提供 SHA 系列,根本不提供 MD5,这也是所有在线 MD5 工具都必须自带一份实现的原因。
为什么输出只有 128 位。128 位 = 16 字节 = 32 个十六进制字符。它由 4 个 32 位寄存器 A、B、C、D 拼接而成,初值是 0x67452301、0xefcdab89、0x98badcfe、0x10325476——这串数字是设计者刻意写成「小端可读」的形式。因为只有 4 个 32 位字,所以再长的输入也只能压成 16 字节,这是「定长」的来源,也是它与 SHA-256(8 个 32 位字、256 位)最直观的区别。
Merkle–Damgård 结构:补位与 512 位分组。消息先补位:接一个 0x80,再补若干个 0x00,最后追加一个 64 位小端的原始位长,使总长度刚好是 512 位(64 字节)的整数倍。这个补位规则制造了两个容易踩的边界:输入 55 字节时,55+1+8 恰好等于 64,只占 1 个分组;输入 56 字节时 56+1+8 变成 65,超出后必须补到 128 字节,占 2 个分组。本页的示例原文是 128 字节,补位后是 192 字节,也就是 3 个 512 位分组——结果区里那一栏显示的就是这个数。
每个分组要做 64 轮。分组先按小端切成 16 个 32 位字 w[0..15](注意:SHA-1 与 SHA-256 用的是大端,这是两族算法最容易写错的地方,混用会算出一串看着像但完全错的摘要)。然后是 4 组各 16 轮的运算,分别使用 F、G、H、I 四个非线性布尔函数与加法、循环左移;循环左移的位数固定循环取 7,12,17,22、5,9,14,20、4,11,16,23、6,10,15,21,每轮按固定顺序取不同的消息字。另外还有一张 64 个常量组成的表 T[i] = floor(232 × |sin(i+1)|),用正弦函数生成只是为了显得随机,它没有任何密码学意义。
雪崩效应有多强。把 ABC 改成 abc,只差 3 个二进制位,摘要从 902fbdd2b1df0c4f70b4a5d23525e932 变成 900150983cd24fb0d6963f7d28e17f72——32 个十六进制位里只有 3 位碰巧相同,其余 29 位全变了。这就是本工具的校验能力来源:内容动一个字节,摘要看起来就完全无关,不存在「改一点、摘要改一点」的渐进关系。
为什么说「加密」是个误称。MD5 没有密钥,也不可逆,正确的叫法是摘要或散列。你可以把它想成一个只会单向压实、不能解压的压缩函数。所有把它当加密用的说法(包括本页沿用搜索习惯保留的「MD5加密」这个名字)都是行业里的历史叫法。
2004 年的碰撞攻击为什么致命。王小云等人在 2004 年公布了 MD5 的高效碰撞搜索方法,此后被不断优化。下面这一对消息各 128 字节,只有 6 个字节不同、每个字节只差 1 个二进制位(合计只差 6 bit),MD5 却完全相同,都是 79054025255fb1a26e4bc422aef54eb4。这意味着「两份内容不同、摘要相同」是可以被主动构造出来的:攻击者可以准备一份正常的文件和一份被篡改的文件,让它们共享同一个 MD5,从而骗过只看摘要的校验。
长度扩展攻击:Merkle–Damgård 结构自带的毛病。因为后一个分组是拿前一个分组的输出当输入接着压,攻击者只要知道 H(secret || msg) 和 secret 的长度,不需要知道 secret 是什么,就能接着算出 H(secret || msg || padding || append)。用一组具体数字走一遍:令 secret 为 10 字节、msg 为 21 字节,服务端公布的摘要若为 c8d7ef5af401d22436aaff5218de8386,攻击者能在本地把 31 字节的原消息加上 33 字节补位、再拼上 11 字节附加内容,得到一条 75 字节的新消息,其摘要 d46f7bd78addc79ab45465938fbd5c7b 是合法可验证的。结论很直接:不要用 H(secret || msg) 当消息认证码,要做完整性认证请用 HMAC。
完整示例(数值均为本页真机算出)
示例条件就是页面打开时的默认状态:原文 柳泉工具 MD5加密(md5jiami)示例:Hello, 柳泉 2026-10-01. 加一个换行再加 第二行用来验证换行符也会参与摘要运算。,共 128 个 UTF-8 字节、28 个汉字,「短哈希位数」取 7,「十六进制大小写」取小写。六项结果如下:
- 小写摘要:
2abfbed520e5a7ba625c59d23c768ad8,固定 32 个十六进制字符; - 大写摘要:
2ABFBED520E5A7BA625C59D23C768AD8,与本工具算出的小写值逐位对应,只是字母换了档; - 摘要 Base64:
Kr++1SDlp7piXFnSPHaK2A==,把 16 字节原样做 Base64 得到 24 个字符(末尾两个=是补位); - 短哈希:取前 7 位得
2abfbed,等价于 28 bit; - UTF-8 字节数:128,与「字符数」不是一回事——中文一个字占 3 字节;
- 补位后的分组数:128+1+7 = 136,向上取整到 64 的整数倍是 192 字节,即 3 个 512 位分组。
拿一个公开测试向量交叉验证一下:RFC 1321 附录里 abc 的 MD5 是 900150983cd24fb0d6963f7d28e17f72,把文本框内容改成 abc 就能得到同一串;message digest 对应 f96b697d7cb7938d525a2f31aaf161d0。本页的纯 JavaScript 实现与这两条标准向量完全一致,也就是说你在别处看到的同算法结果应当与本页逐位相同。
再看几个「看起来一样、算出来不一样」的直观例子:空字符串的摘要是 d41d8cd98f00b204e9800998ecf8427e(不是空值);一个半角空格是 7215ee9c7d9dc229d2921a40e899ec5f;hello 是 5d41402abc4b2a76b9719d911017c592,而 hello (行尾多一个空格)是 f814893777bcc2295fff05f00e508da6。
输入范围与两张对照表
输入范围。文本框上限 20 万个字符(按 UTF-16 码元计),换算成 UTF-8 字节最多约 80 万,纯中文时约 3 个汉字抵 1 个字符上限;超过后输入框不再接收新字符,已有内容不会被截断。「短哈希位数」4~32 的整数。「十六进制大小写」和「比对模式」是下拉选项,只影响展示和提示文案,不改变摘要本身。
第一张表是四个常见摘要算法对同一输入 abc 的输出,用来确认「同一份数据换算法结果完全不同」:
| 算法 | 输出位长 | 十六进制字符 | 字节 | 输入 abc 的结果 |
|---|---|---|---|---|
| MD5(本页) | 128 位 | 32 | 16 | 900150983cd24fb0d6963f7d28e17f72 |
| SHA-1 | 160 位 | 40 | 20 | a9993e364706816aba3e25717850c26c9cd0d89d |
| SHA-256 | 256 位 | 64 | 32 | ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad |
| SHA-512 | 512 位 | 128 | 64 | ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a… |
第二张表就是页面上方那张 24 行的对照表,基准串是 hello,覆盖行尾空格、前导空格、LF / CRLF / CR 三种换行、制表符、UTF-8 BOM、全角与半角空格、全角与半角数字、以及同一个 é 的预组合(U+00E9,2 字节)与分解(e + U+0301,3 字节)两种写法。做文件校验时把它当成排查清单:本地值对不上,先按行比对是哪一类差异,再去修正输入。
顺便把成本也算清楚:128 位的摘要空间是 2128 ≈ 3.4028×1038,按每秒尝试 1012 次算,穷举一条原像约需 1.08×1019 年。但由于碰撞攻击的存在,MD5 的实际安全强度早已不是 128 位,找一对碰撞理论上只需约 264 ≈ 1.84×1019 次运算——这就是为什么今天再也不该用它做防篡改。
结果边界与取舍说明
- 输出长度恒定,没有舍入问题。MD5 全程是 32 位整数加法、异或与循环左移,最终序列化成 16 个字节,因此永远输出 32 个十六进制字符,不存在「小数位取舍」或「超过精度」的可能。唯一用到浮点数的地方是常量表
floor(232×|sin(i+1)|),算完立刻转成 32 位无符号整数,不参与后续运算。 - 大小写不是两个结果。大小写只影响十六进制字母的展示,同一个字节
0xAB写ab或AB都是同一个值。跨系统比对前先toLowerCase()归一化。 - 短哈希是截断,不是另一种算法。取前 7 位十六进制等于只保留 28 bit,它只适合在仓库内部标识对象(Git 就是这么做的),碰撞概率不可忽略,不能当安全标识使用,也不能用它替代完整摘要去比对文件。
- 确定性是它的强项。同一份原文在任何时间、任何机器上算出的 MD5 都一样,这正是跨系统校验的基础;反过来说,只要有任何一位不同,结果就完全不同,所以校验前必须保证两边的字节完全一致。
- 抽象输入会给出真实摘要,不会报错。空输入得到
d41d8cd98f00b204e9800998ecf8427e,而不是空字符串或者提示;只有「短哈希位数」写了非整数、小于 4、大于 32 时才拦截,因为那不是摘要本身的问题,而是展示参数写错了。 - 编码敏感。同一个「工具」两个字,后面跟一个全角空格(U+3000,3 字节)和跟一个半角空格(1 字节),摘要分别是
68f7e7cd7d8eba82d6e2d1e029e753a8与4d11eb80863e025bf08b021f140adbab。触摸屏输入法、网页编辑器、Excel 导出的文本都可能悄悄带入全角空格。 - 它不能证明「内容没被人换过」。这是本页最需要记住的一条边界:MD5 可以证明传输过程没有损坏,但挡不住刻意构造的同摘要替换。需要抗篡改时,请换用 SHA-256 及以上的摘要,或者直接上 HMAC + 密钥。
- 和 SHA-256 的分工。同样是「算摘要」,SHA-256 输出 256 位、目前没有已知的实用碰撞方法,适合放在防篡改、数字签名、证书指纹这类场景;MD5 则应限定在兼容老系统与快速比对两类用途里。但要注意:SHA-256 同样不是为密码存储设计的,它运算太快,GPU 一秒能试几十亿次,存口令必须用加盐的慢哈希。
常见问题
MD5加密 里的「加密」为什么不准确?
因为整个过程没有密钥、也不可逆。加密是「用钥匙锁上、再用钥匙打开」,而 MD5 是单向压实:只能从原文算出摘要,没有任何已知方法能从摘要还原原文。行业里沿用「MD5加密」这个叫法,主要是历史习惯和搜索习惯,本页保留它只是为了让你能搜到,不代表它具备加密能力。
为什么不能再用 MD5 存密码?
三条原因叠加。第一,2004 年以来 MD5 的碰撞可以被主动构造,安全性已经瓦解;第二,即使不碰撞,它的设计目标是「快」,显卡一秒能算几十亿次,配合字典可以极快地撞出弱口令——123456 的 MD5 是 e10adc3949ba59abbe56e057f20f883e、password 是 5f4dcc3b5aa765d61d8327deb882cf99,这两个值在任何一份公开彩虹表里都是第一页;第三,不加盐的话,两个用了同一口令的账号摘要完全相同,泄露一张表等于泄露一片账号。存口令请用加盐的慢哈希。
那 MD5 现在还有什么正当用途?
两类。一是兼容性:与历史系统对账、复现老数据库里的 32 位字段、写数据迁移脚本;二是非对抗性的快速比对:判断两次导出内容是否一致、给缓存键做短标识、检查文件是否在传输中损坏。判断标准很简单——只要这个场景里「有人会主动伪造」成立,就不能用 MD5。
两条不同内容的 MD5 真会撞上吗?
随机两条内容撞上的概率极低:128 位空间是 3.4028×1038,要靠随机碰运气,大约要试 264 ≈ 1.84×1019 次才期望出一对。但 2004 年以后的攻击不是随机碰运气,而是按差分路径主动构造:现在公开的最短碰撞样本只有 128 字节,两条消息只差 6 个二进制位、MD5 却同为 79054025255fb1a26e4bc422aef54eb4。所以「撞不上」这个直觉只对随机输入成立,对刻意设计的内容不成立。
为什么我算出来的 MD5 和网站给的对不上?
按可能性从高到低排查:一是有没有隐藏字符(行尾空格、制表符、BOM,页面下方的对照表覆盖了这些情况);二是换行符是 LF 还是 CRLF,hello 加 LF 得到 b1946ac92492d2347c6235b4d2611184,加 CRLF 得到 af5597c29467a96523a70787c319f4db;三是编码,同一个字符用 GBK 编码的字节和用 UTF-8 编码的字节不一样,摘要自然不同;四是大小写没统一;五是对方算的其实不是原文,而是原文加了盐或者加了前缀。
本页为什么自己写 MD5 实现,不调浏览器接口?
因为浏览器的 Web Crypto(crypto.subtle)只提供 SHA 家族,规范里就没有 MD5,所以任何声称在浏览器里算 MD5 的工具都必须自带一份实现。本页的实现严格按 RFC 1321 的补位规则、小端字序、四组轮函数和固定移位表编写,并用 RFC 1321 附录的标准向量(abc、message digest、26 个字母等)逐条校验过。
长度扩展攻击对这个页面有影响吗?
对「在本页算一段文本的摘要」没有影响,因为这里没有秘密。它影响的是用错姿势的协议设计:把 H(secret || msg) 当作认证标签的服务端,会漏掉「攻击者不需要知道 secret 也能续算」这一点。用真实数字走一遍——10 字节 secret 加 21 字节 msg,公开摘要 c8d7ef5af401d22436aaff5218de8386,攻击者能离线续算出 75 字节伪造消息的合法摘要 d46f7bd78addc79ab45465938fbd5c7b。正确做法是用 HMAC。
输入特别长的文本会算不出来吗?会不会上传?
200 万字节以内的文本在本页都是毫秒级完成,因为纯 JavaScript 的 MD5 每 64 字节只要做 64 轮整数运算。超过 20 万字符的输入框不再接收新内容。所有计算都在当前页面完成,没有任何网络请求,也不会写入浏览器存储;想自己确认,打开开发者工具的 Network 面板输入内容即可看到没有新请求发出。
相关工具
- SHA1哈希生成器:同为 Merkle–Damgård 结构、同样已不适合防篡改,用来对照两代摘要的设计差异。
- SHA512哈希生成器:512 位输出,适合需要长摘要且性能余量充足的场景。
- 哈希值识别器:手上只有一串十六进制、不确定是 MD5 还是别的算法时,先用它判断长度与格式。
- 暴力时间计算器:把字符集、长度和速度代进去,估算一条摘要被穷举需要多久。
- 密码力量检测:评估一条已有口令被猜中的难易,会看字符集、常见词和重复模式。
- 密码熵值计算器:反算给定口令的字符池与信息量,用来核对「长度 vs 复杂度」哪个更划算。
- Base64编码:本页给出的摘要 Base64 就是 16 字节原样编码,想手工验证可以对照这一页。
- 编码解码:查看全部编码解码工具。