免费哈希生成器

生成 MD5、SHA-1、SHA-256、SHA-384、SHA-512 哈希值。

没有数据离开您的设备

结果

密码学哈希函数究竟是什么

密码学哈希函数接受任意大小的输入,并产出固定大小的输出,称为 hash、digest 或指纹。同样的输入永远得到同样的 hash;输入哪怕只改一位,得到的 hash 也会截然不同("雪崩效应");并且函数在计算上几乎不可逆,给定一个 hash,你在实践中无法找到产生它的输入。三种抗性属性让一个哈希函数成为"密码学的":原像抗性(给定 hash h,无法找到输入 m 使得 hash(m) = h);第二原像抗性(给定 m1,无法找到与之同 hash 的另一个 m2);以及抗碰撞(无法找到两个不同的输入具有相同 hash)。一个失去抗碰撞性的哈希,在某些用途上(文件完整性)仍然安全,但在另一些用途上(数字签名)就不再安全了。MD5 和 SHA-1 正好属于这一桶:抗碰撞被攻破,但抗原像还在。

MD5、SHA-1、SHA-2 与 SHA-3 简史

MD2 / MD4 / MD5 是 Ron Rivest 在 MIT 与 RSA Data Security 的工作。MD2 1989 年发布;MD4 1990 年;MD5 1991 年发布,1992 年 4 月作为 RFC 1321 标准化。MD5 在长达十年间是主流哈希,作为下载校验和、密码存储、文件去重和内容寻址系统的默认。第一记警钟在 1995 年敲响:Hans Dobbertin 公布了对 MD5 前身 MD4 的全轮次碰撞攻击;首个针对完整 MD5 的实用碰撞出现在 2004 年 8 月,Wang 与 Yu 公布了两条相互碰撞的 128 字节消息;Vlastimil Klima 在 2006 年把 MD5 碰撞的查找时间从数小时压缩到了在普通商用硬件上的几秒。Marc Stevens 与 TU Eindhoven 和 EPFL 的研究人员合作,在 2008 年 12 月的 25C3 上演示了选择前缀的 MD5 碰撞,产出了一份伪造的 RapidSSL CA 证书。到 2012 年的 Flame 恶意软件出现时,它利用 MD5 碰撞伪造了 Microsoft Update 证书,MD5 在任何安全敏感场景下都已经彻底破了。

SHA("Secure Hash Algorithm")是来自美国国家安全局的一族算法。SHA-0 1993 年 5 月作为 FIPS 180 发布,不到一年因未公开的设计缺陷被撤回。SHA-1 紧随其后,1995 年 4 月以 FIPS 180-1 发布,在消息扩展上做了一处单比特更改,NSA 从未公开解释过这个改动。SHA-1 成了 1990 年代末与 2000 年代的默认哈希,Git 的提交哈希、SSL/TLS 证书,以及几乎每一种签名方案都用它。第一个理论碰撞攻击在 2005 年出现(Wang、Yin、Yu);2015 年的自由起点碰撞(Stevens、Karpman、Peyrin);第一个完整的 SHA-1 碰撞于 2017 年 2 月 23 日以 "SHAttered" 之名交付(Stevens、Bursztein、Karpman、Albertini、Markov),它造出了两份具有相同 SHA-1 哈希的不同 PDF 文件。到 2020 年 1 月,"SHA-1 is a Shambles" 选择前缀攻击(Leurent 与 Peyrin,总成本约为 4.5 万美元的 GPU 租用费)把证书级别的伪造压到了可负担的成本,加快了 Git 项目早在 2018 年就已开始规划的 SHA-256 迁移。SHA-1 现已被 NIST 正式弃用于数字签名与证书。

SHA-2 是接替 SHA-1 的家族:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224 与 SHA-512/256,2002 年 8 月以 FIPS 180-2 发布。SHA-2 是一种防御性设计,输出更大、轮数更多、内部状态更宽,二十三年过去仍然没有被攻破。SHA-256 是数字签名、证书、JWT、比特币区块哈希、内容寻址存储以及大多数文件完整性校验的现代默认。SHA-3 在设计上完全不同,是 Bertoni、Daemen、Peeters 和 Van Assche 提出的 Keccak 海绵结构,经过 NIST 五年公开竞赛,在 2012 年 10 月由 Keccak 胜出;2015 年 8 月以 FIPS 202 发布。SHA-3 不是 SHA-2 的替代(SHA-2 仍然安全);它是一种纵深防御的备选,内部结构截然不同,这样未来即便 SHA-2 被密码分析攻破,SHA-3 也未必受影响。本工具产出 SHA-1、SHA-256、SHA-384 与 SHA-512(Web Crypto API 支持的集合)以及 MD5(通过一段 JavaScript 实现完成,因为 Web Crypto API 故意不收 MD5)。

算法对比

算法输出安全性
MD5128 位(32 个十六进制字符)已破解 · 不适用于安全
SHA-1160 位(40 个十六进制字符)较弱 · 已弃用
SHA-256256 位(64 个十六进制字符)强 · 推荐
SHA-384384 位(96 个十六进制字符)
SHA-512512 位(128 个十六进制字符)

密码学哈希都出现在哪里

抗碰撞被破 vs 抗原像被破:为什么 MD5 还在被使用

一个常见的混淆:既然 MD5 "被破了",为什么每个 Linux 发行版还在送 md5sum?答案是抗碰撞(在 MD5 上被攻破)与抗原像(在 MD5 上仍然完好)之间的区别。碰撞攻击让攻击者能构造出两份不同但同哈希的输入;这对数字签名要紧(攻击者可以造一对碰撞,让受害者签其中一份,然后替换成另一份),也对所有要求哈希"绑定到具体输入"的应用要紧。原像攻击则不同,它能让攻击者从一个哈希反推出原始输入,这才是真正会击破下载校验和、密码哈希或内容寻址标识符的攻击。MD5 的抗原像性并未被破;已发表的最佳原像攻击仍接近理论上的 2128 上界,在任何已知或可预见的硬件上都计算不可行。所以 MD5(和 SHA-1)在以下场景仍然合法:文件完整性校验,前提是你信任公布哈希的来源(能换掉文件的攻击者大概率也能换掉哈希,所以威胁模型是"意外损坏"而不是"故意篡改");缓存键与去重,前提是你掌控两端;HMAC 构造(HMAC-MD5 仍然安全,因为 HMAC 的结构对 MD5 的抗碰撞弱点是稳健的,虽然新代码更应用 HMAC-SHA-256)。必须替换 MD5 的场景包括:数字签名、证书哈希,以及任何攻击者能够构造输入的地方。

Web Crypto API 与对 MD5 的刻意省略

现代浏览器通过 crypto.subtle.digest(algorithm, data) 暴露哈希接口,这是一个异步函数,把哈希以 ArrayBuffer 返回。受支持的算法有:SHA-1、SHA-256、SHA-384、SHA-512。注意里面没有什么:MD5 被刻意省略了。W3C Web Crypto Working Group 明确决定不收 MD5,理由是浏览器里任何对 MD5 的使用要么是历史遗留(用 polyfill 处理更合适),要么是错的(不该被轻易做到)。本工具的 MD5 支持来自页面里打包的一个小 JavaScript 实现(约 10 KB);其余一切(SHA-1、SHA-256、SHA-384、SHA-512,以及所有 HMAC 变体)都走 Web Crypto,以原生速度处理。Web Crypto API 仅在安全上下文下可用(HTTPS 或 localhost),用纯 HTTP 打开本工具会让 SHA 的哈希悄悄失效。

输出格式:Hex、Base64、Base32

哈希本质上是二进制,256 位的哈希就是 32 字节不透明数据。要展示或传输它们,会编码成文本。Hex(Base16)是最常见的编码:每个字节变成两个 hex 字符,所以 SHA-256 输出是 64 个 hex 字符。通用、可读、体积翻倍。Base64 把字节包得更紧(3 字节 → 4 字符);SHA-256 在 Base64 下是 44 个字符(带 padding)或 43 个(不带)。在 JWT(签名按 Base64URL 编码)、integrity SRI 属性,以及任何看重紧凑度的场景里都有用。Base32(RFC 4648)用 32 个字符,排除了视觉上易混的(没有 0/O、1/I/L 之分);用于 TOTP 密钥、ULID 与 onion 地址。本工具默认产出 hex,这是其他每种工具都能看懂的通用格式。

HMAC:用密钥的哈希用于鉴权

HMAC(Hash-based Message Authentication Code)RFC 2104(Krawczyk、Bellare、Canetti,1997 年 2 月)定义的一种结构,把任意一种密码学哈希函数变成一个带密钥的鉴权码。结构是 HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m)),其中 K' 是从秘密 K 派生出的密钥,opad/ipad 是固定的 XOR 填充。这个结构在底层哈希安全的前提下是可证明安全的,而且即使底层哈希的抗碰撞较弱仍然安全(这就是为什么 HMAC-MD5 仍被认为是安全的,以及在 SHA-1 抗碰撞被破之后 TLS 里的 HMAC-SHA1 仍然没问题)。HMAC 有三个主要用途:API 请求签名(AWS Signature v4、GitHub webhooks、Stripe webhooks),由接收方核验请求来自掌握秘密的一方;JWT 完整性(HS256 = HMAC-SHA-256);基于密码的密钥派生(PBKDF2 内部使用 HMAC)。本工具的 HMAC 模式接受一个密钥,产出该密钥下输入的 HMAC。

诚实的范围:这个工具适合做什么、不适合做什么

本工具计算输入文本或文件的原始密码学哈希。适用于:对照公布的校验和验证文件下载、生成内容寻址标识符、为调试 API 计算 HMAC、对比同一文件两份副本的完整性,以及看清某个具体输入会哈希成什么。适用于:密码存储(请用 Argon2id、scrypt 或 bcrypt 这种带合适盐与工作量参数的真正密码哈希函数);把哈希反推回原文(这就是哈希函数的本意,设计上不可能);或产出 SHA-3 / Keccak 哈希(本工具目前从 SHA-2 家族产出 SHA-1、SHA-256、SHA-384 与 SHA-512,加 MD5,SHA-3 在未来功能列表上);产出 BLAKE2 或 BLAKE3 哈希。需要 BLAKE3(用于内容寻址存储的现代高吞吐哈希)请用专门的 CLI;需要密码存储请直接用你应用栈里的 bcrypt/scrypt/Argon2id 库。

隐私:为什么这里也只用浏览器

在服务器上对一个文件做哈希要先把文件传上去。普通的下载校验场景这无所谓,你本来就信任源头。但如果是给内部文档、扫描的身份证件、还在迭代中的 UI 截图,或任何你不希望被复制到陌生人硬盘上的文件做哈希,服务器端做哈希就是泄漏。本工具用 File API 直接在你浏览器里读文件,本地完成哈希,什么都不会离开你的设备。点击"哈希"时打开 DevTools 的 Network 标签即可核验,或者在加载完成后让页面离线(飞行模式),工具仍然能用。Web Crypto API 要求 HTTPS,但运行时不需要任何网络访问。

常见问题

如果 MD5 已被破解,它还能用来做什么?

MD5 仍被广泛用于非安全目的:文件完整性检查(验证下载)、去重、缓存键以及校验和。它绝不应该用于密码哈希或数字签名。

我可以反转哈希以获得原始文本吗?

不能。哈希函数被设计为单向的。然而,攻击者会使用预计算表(彩虹表)来查找常见的哈希值。这就是为什么密码应该使用带盐的慢哈希函数(如 bcrypt)进行哈希,而不是使用原始的 SHA-256。

我对文件进行哈希时,文件会被上传吗?

不会。文件直接在您的浏览器中使用 File API 读取,并使用 Web Crypto API(用于 SHA)或纯 JavaScript 实现(用于 MD5)在本地进行哈希。任何内容都不会发送到任何服务器。

SHA-256 与 SHA-3 有什么区别?

SHA-256 属于 SHA-2 家族(FIPS 180-2,2002 年 8 月),Merkle-Damgård 结构,由 NSA 设计。SHA-3(FIPS 202,2015 年 8 月)是 Keccak 家族,海绵结构,由 Bertoni、Daemen、Peeters 与 Van Assche 设计,经 NIST 公开竞赛挑选出来。SHA-3 不是 SHA-2 的替代(SHA-2 仍然安全);它是一种内部结构完全不同的纵深防御备选,这样未来若 SHA-2 被攻破,也未必影响 SHA-3。对于 2026 年的新应用,SHA-256 仍然是合理的默认;SHA-3 在以太坊与后量子方案里越来越多被使用。本工具目前支持 SHA-2(SHA-1 / 256 / 384 / 512);SHA-3 在未来功能列表上。

什么是 HMAC,我什么时候需要它?

HMAC(Hash-based Message Authentication Code,RFC 2104,1997)是一种带密钥的哈希结构,用来证明一条消息是由知道某共享秘密的人创建的。只要你需要核验"某个请求来自正确的一方",就需要它,验证 GitHub webhook 签名(秘密就是 webhook 的签名密钥)、Stripe webhook 签名、AWS API 请求签名(Signature v4 就是 HMAC-SHA-256)、或 JWT 签名(HS256 = HMAC-SHA-256)。即便底层哈希的抗碰撞较弱,HMAC 仍然安全,这就是 HMAC-MD5 仍被视为安全的原因,而新代码里的现代默认是 HMAC-SHA-256。

我做哈希的时候,我的文件会被上传吗?

不会。文件是在你浏览器里通过 File API 直接读取并在本地完成哈希的,SHA 系列算法走 Web Crypto API,MD5 走一段小 JavaScript 实现。什么都不会过网络,在做计算时打开 DevTools 的 Network 标签即可核验,或者在加载完成后让页面离线。可放心用于对内部文档、扫描的身份证件、还在迭代中的 UI 截图,或任何你不希望被复制到陌生人硬盘上的文件做哈希。

相关工具