免费哈希生成器
生成 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)。
算法对比
| 算法 | 输出 | 安全性 |
|---|---|---|
| MD5 | 128 位(32 个十六进制字符) | 已破解 · 不适用于安全 |
| SHA-1 | 160 位(40 个十六进制字符) | 较弱 · 已弃用 |
| SHA-256 | 256 位(64 个十六进制字符) | 强 · 推荐 |
| SHA-384 | 384 位(96 个十六进制字符) | 强 |
| SHA-512 | 512 位(128 个十六进制字符) | 强 |
密码学哈希都出现在哪里
- 文件完整性 / 校验和。Linux 发行版镜像在 ISO 下载旁同时发布 SHA-256(以及历史上 MD5/SHA-1)的哈希;用户对下载到的文件计算哈希,并与公布的值对比。不一致就意味着下载被损坏或被篡改。
shasum、sha256sum和md5sum是 Unix 上的标准工具。 - 密码存储,但绝不要用裸哈希。直接存
SHA-256(密码)是危险的,因为 rainbow tables(预先算好的(密码 → 哈希)映射)能在毫秒级把裸哈希密码反推回去。正确的模式是带每用户盐值与可调工作量参数的密码哈希函数(KDF):Argon2id(RFC 9106,2021,现代推荐)、scrypt(RFC 7914,Percival 2009),或 bcrypt(Provos 与 Mazières,USENIX 1999)。三者都把每用户盐(让相同密码产出不同的存储哈希)和故意昂贵的计算(让暴力破解被硬件成本拖慢)结合起来。本工具计算的是裸哈希,对很多用途有用,但仅靠它本身不适合存储密码。 - 数字签名。签名要签的是哈希,不是数据本身,数据太长无法高效签名。RSA、DSA、ECDSA 与 EdDSA 都是对消息的哈希做签名。所用的哈希函数必须抗碰撞(否则攻击者就能换掉一个能碰撞的消息);这正是 MD5 和 SHA-1 在签名场景被弃用的原因。
- Git 的内容寻址存储。每一个 Git 对象(blob、tree、commit、tag)都由其内容的 SHA-1 来标识。Linus Torvalds 2005 年的设计选择,如今正处于一场跨年的迁移之中,目标是 SHA-256,起因正是 SHA-1 被攻破的抗碰撞性。Git for Windows 与 core Git 都已发布 SHA-256 支持;生产环境的迁移在逐步进行。
- 比特币与以太坊。比特币的区块哈希与交易 ID 用的是双重 SHA-256(哈希函数主导比特币挖矿成本,ASIC 的存在就是为了把 SHA-256 算得很快)。以太坊用的是 Keccak-256(NIST 标准化微调之前的原始 Keccak;有时被称作"减去 padding 改动的 SHA-3")。
- JWT 签名验证。JSON Web Token 通常用 HMAC-SHA-256 签名(JWT 规范里的算法名 "HS256"),或在 SHA-256 哈希之上用 RSA/ECDSA 签名。签名让接收方能验证令牌确实来自签发者并且没有被篡改。
- 子资源完整性(SRI)。
<script>与<link>标签上的integrity="sha256-..."属性,允许浏览器在执行 CDN 托管的脚本之前验证它没有被改动,这是对被攻陷 CDN 的防线之一。 - API 请求签名。AWS Signature Version 4 用 HMAC-SHA-256 配合用户的 secret access key 给每一个 API 请求做签名。这能在不把秘密放上线的前提下完成请求的鉴权,同时通过时间戳防止重放攻击。
抗碰撞被破 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 截图,或任何你不希望被复制到陌生人硬盘上的文件做哈希。