如何用哈希验证文件完整性

· 9 分钟阅读

当你下载软件、固件或重要文档时,如何知道文件正是发布者预期的内容?文件哈希给你一个加密指纹,一个只要文件相差一个字节就会改变的唯一字符串。验证哈希只需几秒钟,可以让你避免安装被篡改的软件、刷入会变砖的损坏固件,或信任一份在你真正需要恢复时会失败的损坏备份。

哈希函数简史

校验和的概念比计算本身更古老,会计师在出现可验证的文件之前就用数字位求和来检测抄写错误。加密哈希出现于 1980 年代末。Ron Rivest 在 1990 年发布了 MD4,1991 年发布了 MD5,后者在两十年里成为事实上的校验和。NIST 在 1993 年标准化了 SHA-0,但在发现缺陷后于 1995 年迅速将其撤回并采用 SHA-1。SHA-2 系列(SHA-224、SHA-256、SHA-384、SHA-512)在 2001 年跟进,以应对 SHA-1 迫近的弱点。

每一代都被比预期更便宜的攻击退役。MD5 碰撞在 2004 年得到展示,2008 年对数字证书变得实用,如今轻而易举。SHA-1 在 2017 年被 Google 的 SHAttered 攻击攻陷,研究者制造了两份具有相同 SHA-1 摘要的不同 PDF。SHA-2 自 2001 年以来一直挺住,SHA-3(Keccak,2015 年标准化)提供了一个结构上不同的备选,以防 SHA-2 哪天破裂。教训是哈希算法有保质期;今天合适的算法可能在十年内需要替换。

文件哈希如何工作

哈希函数读取文件的每个字节,产生一个固定长度的字符串。同一文件总产生同一哈希。改一个字节,哈希完全改变,这叫做雪崩效应,正是它让哈希对验证有用。

示例:

即使两个文件只差一位,两个哈希也没有任何可识别的共同模式。这种敏感性正是让验证成为可能的原因:生成哈希、与已发布哈希比较,你就立即知道文件是否真实。

在内部,现代哈希函数把文件切成固定大小的块(SHA-256 是 64 字节,SHA-512 是 128 字节),把每个块送进一个压缩函数,并把状态向前链接。输出是混入最后一块后的最终状态。因为链依赖于每一个字节,没有任何捷径让攻击者能在不重写整个哈希的情况下改变内容。

如何验证一个文件

  1. 找到官方哈希,软件发布者通常在其下载页面列出文件哈希,常标记为「SHA-256 校验和」或「SHA256SUMS 文件」。
  2. 上传你下载的文件:在哈希计算器中选择文件。哈希在你的浏览器中本地计算;文件从不离开你的机器。
  3. 比较哈希:如果你计算的哈希与官方哈希完全一致,文件就是真实且未损坏的。如果字符串很长,把两者复制粘贴到文本差异工具中。
  4. 匹配算法:SHA-256 哈希只能与其他 SHA-256 哈希匹配。如果发布者给你 SHA-512,也生成 SHA-512;混淆算法是「不匹配」最常见的错误。
  5. 条件允许时验证已发布的哈希本身:一个签名的 SHA256SUMS 文件(用发布者的 GPG 密钥签名)告诉你哈希列表未被篡改,而下载页上的裸哈希做不到。

何时验证文件哈希

支持的算法

算法哈希长度输出位建议
MD532 个十六进制字符128仅遗留,已破,仅用于偶发性损坏
SHA-140 个十六进制字符160仅遗留,已破,不要在安全场景信任
SHA-22456 个十六进制字符224小众;优先 SHA-256
SHA-25664 个十六进制字符256建议的通用标准
SHA-38496 个十六进制字符384高安全,用于 TLS 1.3 套件
SHA-512128 个十六进制字符512SHA-2 的最大强度,在 64 位 CPU 上快
SHA3-25664 个十六进制字符256与 SHA-2 不同的内部设计,前瞻性
BLAKE2b/BLAKE3可变256 或 512最快的现代哈希,rsync、restic 在用
CRC328 个十六进制字符32仅错误检测,不是安全哈希

如果你可以选择,SHA-256 是合理的默认。在 64 位机器上用 SHA-512 可略快(该算法面向 64 位字调优)。当吞吐最为关键时拿 BLAKE3,它能饱和现代 NVMe SSD,这是 SHA-256 做不到的。

哈希 vs 数字签名

哈希告诉你文件是否改变。数字签名告诉你它是否改变以及谁创建了哈希。签名是被发布者私钥加密的哈希;你用其公钥解密、重新计算哈希,然后检查二者是否一致。如果一致,你就知道文件完整,而且发布者(或持有其私钥的人)批准了它。

当下载页同时显示一个 SHA-256 哈希和一个 .sig.asc 文件时,哈希防的是损坏与意外篡改,而签名防的是攻破下载服务器的攻击者。攻击者可以替换文件并更新显示的哈希;但没有发布者的密钥就无法伪造有效签名。

常见陷阱

替代工具与场景

当你只有一个文件要验证时,网页哈希计算器是最快的路径。对于重复使用或脚本化,命令行工具是标准。

工具平台优势注意
网页哈希计算器浏览器免安装,文件从不上传一次一个文件
sha256sumLinux快、可脚本、GNU coreutils--check 读取 SHA256SUMS 文件
shasum -a 256macOS、BSD自带,输出格式相同与 Linux 上二进制名不同
Get-FileHashWindows PowerShellWindows 上一等公民输出格式与 sha256sum 不同
certutil -hashfileWindows cmd每个 Windows 都有输出冗长需要解析
openssl dgst -sha256跨平台如果你已经有 OpenSSL比专用工具慢
b3sum跨平台BLAKE3,数 GB/s 吞吐较新,不那么普及
rhash跨平台一次计算多种算法额外安装

在 CI/CD 流水线中,同一任务通常表现为构建时 sha256sum file > file.sha256,验证时 sha256sum -c file.sha256,有时包裹在一份签名清单里。原则(计算、发布、取回时比较)与浏览器工具在交互场景下做的事是一致的。

隐私与哈希计算器

哈希计算器完全在你的浏览器中运行。你选择的文件通过 FileReader API 读取,送入 Web Crypto SubtleCrypto 接口,结果哈希展示给你。文件的字节从不前往我们的服务器,没有上传、没有关于哪些文件被哈希的日志,也没有关于文件大小或扩展名的分析。对于敏感材料,合同、医疗记录、私钥,会上传的工具与本地哈希的工具之间的差别,就是信任一个第三方与不信任任何人的差别。哈希是一个微小输出(SHA-256 的 64 个十六进制字符),但它汇总的输入可能高度敏感。把那份输入保留在客户端是任何验证任务的合理默认。

常见问题

如何将文件哈希与官方的对比?

生成哈希后,与源(通常在下载页面)发布的哈希逐字符对比。如果所有字符都匹配,文件真实且未损坏。只要有一个差异都意味着文件被修改。

应使用哪种哈希算法?

SHA-256 是文件验证的标准。使用发布者提供的算法。如果您可以选择,SHA-256 在安全性和性能之间提供了良好平衡。

损坏的文件可能有正确的哈希吗?

理论上可能(碰撞),但在 SHA-256 下统计上可以忽略。几率如此微小,实际上相同的哈希保证文件相同。

我的文件会发送到服务器吗?

不会。哈希完全在您的浏览器中计算。您的文件从不离开您的设备,对任何类型的文档(包括敏感文档)都是安全的。

What is the difference between a hash and a digital signature?

A hash proves a file has not changed since the hash was computed; anyone can verify it. A digital signature proves both integrity AND identity, the publisher signs the hash with their private key, and you verify with their public key. Hashes alone do not protect against a hacker who replaced both the file and the published hash on the same compromised mirror.

Why are MD5 and SHA-1 considered insecure?

Researchers have demonstrated practical collision attacks for both. In 2017 Google produced two different PDFs with identical SHA-1 hashes (the SHAttered attack), and MD5 collisions can be generated in seconds on a laptop. For deliberate-tamper detection use SHA-256 or stronger; MD5 and SHA-1 still work for catching accidental corruption but should never be trusted as security boundaries.