ToolAct工具行动

哈希计算器

支持 MD5、SHA-1、SHA-256、SHA-384、SHA-512 多种哈希算法

选择哈希算法
MD5
128
SHA-1
160
SHA-256
256
SHA-384
384
SHA-512
512

什么是哈希?

哈希(Hash)是一种将任意长度的数据映射为固定长度摘要的算法。相同的输入始终产生相同的输出,而微小的输入变化会导致完全不同的输出,且无法从哈希值反推原始数据。常见的哈希算法包括 MD5、SHA-1、SHA-256、SHA-384、SHA-512 等,广泛用于数据完整性校验、密码存储、数字签名等场景。 安全相关结果不能孤立判断,还要结合密钥、使用场景、算法选择和可信来源一起评估。

使用方法

使用方法

  1. 选择输入模式:文本输入或文件上传
  2. 输入文本内容或拖放文件
  3. 勾选需要生成的哈希算法(可多选)
  4. 点击「生成哈希」按钮进行计算
  5. 点击「复制」保存单个哈希值,或「全部复制」复制所有结果

哈希说明

  • 哈希值是确定性的指纹,输入中哪怕只改动一个字节,结果都会完全不同。
  • 安全场景下请使用 SHA-256 或更强的算法进行完整性校验,新建的安全工作流应避免使用 MD5/SHA-1。

使用场景

用多种算法生成文本或文件哈希在文本和文件输入之间切换,选择 MD5(128 位)、SHA-1(160 位)、SHA-256(256 位)、SHA-384(384 位)或 SHA-512(512 位),只生成你需要的摘要。文本模式通过 JavaScript 实现以 UTF-8 编码哈希输入;文件模式使用 Web Crypto 的 SubtleCrypto.digest 进行流式 SHA-2 计算,输入内容不会离开本地设备。
将生成的哈希与剪贴板内容比对对某个结果使用比对操作,检查当前剪贴板中的值是否与该摘要匹配,适合验证复制的校验和或 API 示例。比对过程会规范化十六进制大小写,因此大写的发布方摘要和小写的生成摘要也能匹配,但算法标识必须一致(SHA-256 输出 64 个 hex 字符,SHA-512 输出 128 个)。
根据用途选择合适的算法MD5 和 SHA-1 仅用于旧版兼容和快速指纹识别(两者均已公开碰撞攻击,不适合数字签名);当哈希用于检测篡改时,请优先选择 SHA-256 或更强的算法。SHA-512 因其 64 位字长在 64 位 CPU 上运行最快,这是在服务器级硬件上选择它的一个实用理由。
验证下载文件的校验和是否与发布摘要一致切换到文件模式,计算下载文件的 SHA-256(或 SHA-512),然后将发布方公布的校验和粘贴到比对字段中,在安装或部署前确认逐字节完整性。不完整的下载或中断的传输会产生不同的摘要,这正是此流程要捕获的问题。
跨编码边界重现相同的摘要切换 UTF-8 与原始字节模式,对同一字符串重新哈希,理解为什么相同的逻辑文本在源编码、BOM 或换行符不同时会产生不同的 MD5 或 SHA-1 值。字符串开头的 UTF-8 BOM(0xEF 0xBB 0xBF)会改变摘要,即使可见字符完全相同——这能在校验和不匹配发生之前发现问题。

技术原理

密码学哈希函数将任意长度的输入映射为固定长度的摘要,具有三个安全属性:原像抗性(难以逆推)、第二原像抗性(难以找到具有相同摘要的另一输入)和碰撞抗性(难以找到任意两个具有相同摘要的输入)。MD5(Rivest 1991,RFC 1321)、SHA-1(NIST FIPS 180-1,1995)和 SHA-2 家族(FIPS 180-4,2012)都是 Merkle-Damgård 构造:输入被填充到块大小的倍数,然后通过单向压缩函数迭代。MD5、SHA-1、SHA-256 的块大小为 512 位,SHA-512 为 1024 位。摘要大小分别为 128 / 160 / 256 / 384 / 512 位。 MD5(Rivest 1991)是 128 位哈希,64 轮四分之一轮运算,四个 32 位链接字(A, B, C, D),常量由正弦函数派生(无安全意义,仅用于打破对称性)。碰撞攻击:王小云等人 2004 年将 MD5 碰撞搜索降低到 2⁴⁰ 次哈希计算(手工推导的差分路径);Stevens 2009 年编写了选择前缀碰撞工具;Flame 恶意软件 2012 年使用新型选择前缀攻击伪造了微软代码签名证书,标志着首个公开已知的 MD5 碰撞野外利用。如今,一次 MD5 碰撞在 CPU 上花费不到一美元,在 GPU 上仅需毫秒。任何新协议应使用 SHA-256。 SHA-1(FIPS 180-1,2011 年被 FIPS 180-4 废弃)是 160 位哈希,80 轮运算,五个 32 位链接字。SHAttered 攻击(Stevens 等人,2017 年 2 月)产生了首个实际可行的 SHA-1 碰撞,耗时约 6,500 CPU 年和 110 GPU 年。到 2020 年,选择前缀碰撞约需 45,000 美元的 GPU 时间即可实现;到 2025 年,商用硬件上的碰撞成本已远低于 10,000 美元。Git 在 2020 年从 SHA-1 迁移到 SHA-256;自 2017 年起 HTTPS 证书已不允许使用 SHA-1。SHAttered 碰撞输出('SHAttered.pdf' 和 'SHAttered2.pdf')是标准测试向量:它们的 SHA-1 摘要相同但内容不同。 SHA-2(FIPS 180-4,2012)涵盖六种哈希:SHA-1 的后继 SHA-224、SHA-256、SHA-384、SHA-512 以及两个截断变体 SHA-512/256 和 SHA-512/224。SHA-256 内部使用六个逻辑函数(Ch、Maj、Σ0、Σ1、σ0、σ1)和 64 个轮常数 K[t] = ⌊∛(第 t 个素数的小数部分的前 32 位)⌋——素数立方根构造纯粹是为了美学,没有安全作用。SHA-256 自 ~2010 年起一直是主力算法,是 TLS 1.3(RFC 8446)、比特币工作量证明(直到 2025 年的讨论)和大多数内容寻址存储的事实标准。SHA-512/256 在 64 位硬件上更快,因为它使用 64 位字并运行 SHA-512 的压缩然后截断。 SHA-3(FIPS 202,2014)和 Keccak(原始提交)使用根本不同的结构:Keccak-f[1600] 海绵构造,1600 位状态,交替吸收/挤压阶段。SHA-3 与 SHA-2 具有相同的摘要大小,但能抵抗影响 Merkle-Damgård 哈希的长度扩展攻击——这在哈希秘密前缀 MAC 时很有用。BLAKE2(RFC 7693)在软件中比 SHA-256 更快,WireGuard、Argon2 和多种现代协议都在使用。 本页面通过 SubtleCrypto.digest 在浏览器中运行 SHA-1、SHA-256、SHA-384 和 SHA-512(调用平台原生代码——Chromium 上是 OpenSSL/BoringSSL,Firefox 上是 NSS,Safari 上是等效实现),并回退到纯 JS 的 MD5 实现,因为 SubtleCrypto 不暴露 MD5(根据 W3C Web Crypto API,MD5 处于 'recommend-only' 状态)。对于 10MB 文件,V8 中的 SHA-256 在现代笔记本上运行速度约 400 MB/s,而纯 JS 的 MD5 约 100-150 MB/s——Web Crypto SHA 家族比任何纯 JS 实现快 3-4 倍,这就是页面将 SHA-1 及以上算法路由到原生接口的原因。

  • MD5(Rivest 1991,RFC 1321):128 位摘要,512 位块,64 轮,Merkle-Damgård 构造。自 Wang 2004(2⁴⁰ 工作量)起已被碰撞攻破,2012 年 Flame 中被选择前缀攻破——新代码中不要使用,但用于非安全校验和、ETag、内容指纹或缓存键仍然没问题。
  • SHA-1(FIPS 180-1,1995;2011 年被 FIPS 180-4 废弃):160 位摘要。SHAttered 碰撞(Stevens 等人,2017 年 2 月)耗时约 6,500 CPU 年;选择前缀碰撞现已低于 10,000 美元。Git 于 2020 年迁移到 SHA-256;CA/Browser Forum 于 2017 年禁止在 HTTPS 证书中使用 SHA-1。
  • SHA-256(FIPS 180-4):256 位摘要,64 轮 Ch/Maj/Σ0/Σ1/σ0/σ1 运算,64 个轮常数 K[t] 由 ∛(素数) 小数部分派生。TLS 1.3(RFC 8446)、大多数内容寻址存储和比特币挖矿的主力算法。256 位安全级别提供约 128 位碰撞抗性。
  • SHA-384/SHA-512(FIPS 180-4):SHA-512 使用 64 位字,80 轮,1024 位块。在 64 位硬件上比 SHA-256 快约 1.5-2 倍。SHA-384 是 SHA-512 截断到 384 位;SHA-512/256 是 SHA-512 截断到 256 位,比 SHA-256 具有更好的长度扩展抗性。
  • SHA-3(FIPS 202,2014)/ Keccak:海绵构造,使用 Keccak-f[1600] 置换,SHA3-256/384/512 的速率分别为 1088/832/576 位。能抵抗影响 Merkle-Damgård 哈希的长度扩展攻击——适用于秘密前缀 MAC。
  • BLAKE2(RFC 7693)和 BLAKE3 是现代快速哈希;BLAKE2s 通常用于 MAC 密钥派生,BLAKE2b 被 WireGuard 和多种协议使用,BLAKE3 增加了 Merkle 树以支持并行哈希。截至 2025 年尚未纳入 Web Crypto,因此本页面不提供。
  • Web Crypto API(W3C):SubtleCrypto.digest('SHA-256', data) 返回 Promise<ArrayBuffer>,由平台原生代码计算。V8 上 SHA-256 约 400 MB/s,纯 JS 的 MD5 约 100-150 MB/s——3-4 倍的差距就是页面将 SHA-1 及以上路由到 SubtleCrypto 的原因。
  • 长度扩展注意事项:H(secret || message) 对任何 Merkle-Damgård 哈希(MD5、SHA-1、SHA-2)在攻击者知道摘要和消息长度时均可伪造。HMAC(RFC 2104)和 SHA-3 可避免此问题。MAC 应使用 HMAC-SHA-256 或 KMAC;对于不可信输入的哈希,原始摘要即可。

示例

FIPS 180-2 测试向量:空字符串与 'abc'

输入:  '' (empty, 0 bytes)
MD5:     d41d8cd98f00b204e9800998ecf8427e   (32 hex chars)
SHA-1:   da39a3ee5e6b4b0d3255bfef95601890afd80709   (40 hex chars)
SHA-256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855   (64 hex chars)
SHA-512: cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e

输入:  'abc' (3 bytes, the canonical FIPS test vector)
MD5:     900150983cd24fb0d6963f7d28e17f72
SHA-1:   a9993e364706816aba3e25717850c26c9cd0d89d
SHA-256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA-512: ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f

输出长度由算法本身决定(MD5 128 位、SHA-1 160 位、SHA-256 256 位、
SHA-512 512 位),与输入长度无关。

FIPS 180-2 56 字节测试向量(多块输入)

输入:  'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq' (56 bytes)

SHA-256: 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
SHA-512: 8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018
         50d1c9ef3504cabb287a00833cf81a7e (128 hex chars - 此处只显示前 64,
         完整摘要为 64 字节 / 1024 位)

这条 56 字节向量横跨两个 512 位 SHA-256 数据块,会触发消息扩展
(words 16..63 的 sigma_0 / sigma_1 计算)。它是 NIST CAVP 针对 SHA-256
的参考输入,也是验证消息扩展循环是否实现正确的标准方式。
如果摘要匹配,说明分组填充、长度追加、最终状态相加都没有问题。
SHA-512 使用相同的 Merkle-Damgard 结构,但字长为 64 位、轮数 80,
因此同样的 56 字节输入会得到 128 个十六进制字符的摘要。

雪崩效应与编码陷阱

输入:  '' (empty)        MD5: d41d8cd98f00b204e9800998ecf8427e
输入:  'a' (one byte)     MD5: 0cc175b9c0f1b6a831c399e269772661

仅多一个字节,输出的每一位几乎都会变化——这就是雪崩效应。
大小写也是一样(a -> A,0x61 变 0x41,相差一位 0x20),
以及行尾空白同理。要注意的是,肉眼看着相同的文本,
是否带末尾 '\n' 或带 UTF-8 BOM (0xEF 0xBB 0xBF),得到的摘要也不同。
所以核对官方校验值时,必须保证字节序列完全一致,而不是看起来一样。
浏览器和 Node 会先用 TextEncoder 把字符串转成确定的字节序列;
那些直接吃字符串的 JS MD5 实现,对非 ASCII 输入会算出错误的结果。

用 sha256sum 校验文件完整性

$ sha256sum ubuntu-24.04-desktop-amd64.iso
4d0c238817f7d74c93cfbe7939f8f7a4f9a0d0c7c0e8a6c4f9a0d0c7c0e8a6c4 *ubuntu-24.04-desktop-amd64.iso

1. 在本页切换到文件模式,把同一个 .iso 拖进去,选择 SHA-256。
2. 把得到的 64 位摘要复制到对比框。
3. 摘要一致说明下载文件与发布方完全相同;
   不一致则意味着文件损坏、下载不完整,或与清单中的版本不符。

同一个文件,MD5 和 SHA-1 摘要分别为 32 位和 40 位;
SHA-256 和 SHA-512 分别为 64 位和 128 位。比对前请确认
发布方使用的是同一种算法。

常见问题

本工具支持哪些算法?

通常包括 MD5、SHA-1、SHA-256、SHA-384、SHA-512,有时还有 SHA-3 / RIPEMD-160。当下的标准选择是 SHA-256;MD5 和 SHA-1 仅适合非安全场景的校验和。

哈希和加密是一回事吗?

不是。哈希是单向的——拿到哈希值后没有算法能反推出原始输入(除非对极小的输入空间暴力破解)。加密则可以用密钥还原。哈希用于指纹和完整性校验,加密用于保护机密性。

输入是在哪里完成哈希的?

所有哈希计算都通过 Web Crypto API 或纯 JS 实现,在浏览器中完成。不会发送到服务器。粘贴输入时打开“网络”面板即可验证。

为什么同样的输入在另一个网站上得到的哈希不同?

差异通常源于输入的预处理:换行符(CRLF 与 LF)、末尾空白、字符编码(UTF-8 与 UTF-16),或者某个工具自动追加了换行符。哈希算法本身在所有实现上都是确定性的。

可以反向解出哈希吗?

数学上不行。实际中,从小空间里取的短输入(常见密码、字典词、短数字)可以通过预先计算好的彩虹表查出来。这正是我们要加盐并使用 bcrypt、Argon2 等慢哈希的原因——本工具无法替代它们。

可以用本工具来哈希密码吗?

不可以。仅靠 SHA-256 用作密码存储速度太快。请使用带每用户盐和合理工作因子的 bcrypt、scrypt 或 Argon2。SHA 系列适合做文件完整性、内容寻址和签名输入,而不适合密码。

为什么不同算法的哈希长度不一样?

每种算法都有固定的摘要长度:MD5 为 128 位(32 个十六进制字符),SHA-1 为 160 位(40 个),SHA-256 为 256 位(64 个),SHA-512 为 512 位(128 个)。位数越长抗碰撞越好,但哈希本身占用的存储也越多。