← 返回博客

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

2026-04-05 · 5 分钟阅读

为什么要验证文件完整性

文件在互联网上传输时,可能会因为网络错误、存储介质问题或中间服务器故障而发生损坏。更严重的情况是,如果软件下载站被攻击者入侵,分发的安装包可能被植入恶意代码。通过比较文件的哈希值(由官方发布方提供)与你本地下载文件的哈希值,可以检测这两种情况。

在 Linux 上验证文件哈希

# Calculate MD5 hash of a file
md5sum ubuntu-24.04-desktop-amd64.iso
# Output: a39513a0badf2ea1a9c24b0a3a9b4c45  ubuntu-24.04-desktop-amd64.iso

# Calculate SHA256 hash
sha256sum ubuntu-24.04-desktop-amd64.iso
# Output: [64-char hash]  ubuntu-24.04-desktop-amd64.iso

# Verify against a checksum file (if provided)
sha256sum -c SHA256SUMS
# ubuntu-24.04-desktop-amd64.iso: OK

# Batch verify multiple files
sha256sum -c checksums.txt

在 macOS 上验证文件哈希

# MD5 (built-in md5 command)
md5 ubuntu-24.04-desktop-amd64.iso
# MD5 (ubuntu-24.04-desktop-amd64.iso) = a39513a0badf2ea1a9c24b0a3a9b4c45

# SHA256 (using shasum)
shasum -a 256 ubuntu-24.04-desktop-amd64.iso
# [64-char hash]  ubuntu-24.04-desktop-amd64.iso

# Also works with openssl
openssl md5 myfile.iso
openssl sha256 myfile.iso

在 Windows 上验证文件哈希

# PowerShell: Get-FileHash (built-in)
Get-FileHash ubuntu-24.04.iso -Algorithm MD5
Get-FileHash ubuntu-24.04.iso -Algorithm SHA256

# Output format:
# Algorithm  Hash                              Path
# ---------  ----                              ----
# SHA256     [64-char hash]                    C:\...\ubuntu-24.04.iso

# Compare hashes directly in PowerShell
$expected = "abc123..."
$actual   = (Get-FileHash ubuntu.iso -Algorithm SHA256).Hash
if ($expected -eq $actual) { "MATCH - file OK" } else { "MISMATCH - file corrupted!" }

实际验证步骤

  1. 从软件官网下载文件,同时找到官方提供的哈希值(通常在下载页面或单独的 .sha256 文件中)
  2. 使用上述命令计算你下载的文件的哈希值
  3. 将计算结果与官方提供的值逐字符比较(注意大小写不影响 MD5/SHA256 的等价性,但建议统一为小写或大写再比较)
  4. 如果完全匹配,文件完整;如果不匹配,文件已损坏或被篡改,应重新下载

哈希验证的局限性

仅靠哈希验证有一个重要局限:如果官方发布者的网站本身被黑客入侵,攻击者可能同时替换下载文件和哈希值,这样你计算的哈希会和网站上显示的一致,但两者都是恶意版本。这就是为什么很多重要软件(如 Linux 发行版、安全工具)还提供了 GPG 数字签名——你可以独立验证签名来确认文件真的来自可信的发布者,而不仅仅是文件完整。

应该使用 MD5 还是 SHA256 验证

如果官方同时提供了 MD5 和 SHA256,优先使用 SHA256。尽管 MD5 的碰撞问题让它不适合安全签名,但对于"文件在传输中被意外损坏"这种场景,MD5 仍然有效(随机损坏不可能恰好产生一个碰撞)。然而,对于"防止恶意篡改"这种场景,必须使用 SHA256 或更强的哈希,因为攻击者可能精心构造一个碰撞。

立即免费使用相关工具

免费使用 →