← 返回博客

如何验证下载文件未被篡改

2026-04-16 · 5 分钟阅读

下载文件被篡改的真实威胁

下载文件被篡改并不是理论上的威胁。2016 年,Linux Mint 官网被黑客入侵,黑客修改了下载链接,使数千用户下载了含后门的 ISO 镜像。2017 年,著名 CCleaner 软件被攻击者在供应链中植入恶意代码,影响了数百万用户。2020 年,SolarWinds 软件更新被植入 Sunburst 后门,影响了包括美国政府在内的数千个组织。这些案例说明,即使从"官方"渠道下载,也可能存在风险。

第一层防护:哈希校验

哈希校验是验证文件完整性的基础。步骤:从软件官网下载文件,同时找到官方提供的哈希值(通常在下载页面附近或单独的校验和文件中),计算你下载的文件的哈希,与官方值比较。

# Linux/macOS: SHA256 verification
sha256sum -c SHA256SUMS
# Or manually:
sha256sum ubuntu-24.04-desktop-amd64.iso
# Compare with: a0d2dfd574d2dec14571bce...

# Windows PowerShell:
(Get-FileHash ubuntu-24.04.iso -Algorithm SHA256).Hash -eq "a0d2dfd574d2dec..."
# Returns True if match

第二层防护:GPG 签名验证

哈希验证的局限是:如果官网被黑,哈希值和文件可能同时被替换。GPG 数字签名提供了更强的保证:软件发布者用私钥对校验和文件进行签名,任何人都可以用公钥验证签名的真实性。即使官网被黑客替换了文件和哈希,他们也无法伪造正确的 GPG 签名(因为私钥是发布者保留的)。

# Example: Verifying Ubuntu ISO with GPG

# Step 1: Import Ubuntu's signing key (do this once)
gpg --keyserver hkps://keyserver.ubuntu.com \
    --recv-keys "843938DF228D22F7B3742BC0D94AA3F0EFE21092"

# Step 2: Download ISO and signature files
# ubuntu-24.04-desktop-amd64.iso
# SHA256SUMS (checksum file)
# SHA256SUMS.gpg (signature file)

# Step 3: Verify the signature on SHA256SUMS
gpg --verify SHA256SUMS.gpg SHA256SUMS
# Good signature from "Ubuntu CD Image Automatic Signing Key"

# Step 4: Verify the ISO matches SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing
# ubuntu-24.04-desktop-amd64.iso: OK

验证 Docker 镜像完整性

# Pull with specific digest (content-addressable)
docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

# Verify after pull
docker inspect ubuntu --format=''

# Docker Content Trust (automatically verifies signatures)
export DOCKER_CONTENT_TRUST=1
docker pull myorg/myimage:v1.0
# Will fail if no valid Notary signature

验证 npm 包完整性

npm 使用 SHA512 校验和验证每个包的完整性。package-lock.json 中的 integrity 字段存储了每个包的 SHA512 哈希(以 sha512- 前缀的 Base64 格式)。npm install 时会自动验证。

// package-lock.json integrity field example
{
  "name": "some-package",
  "version": "1.0.0",
  "integrity": "sha512-ABC123...==",
  // npm verifies this hash on every install
}

// Manual verification
npm ci  # Uses lock file, strictly verifies integrity
npm install --ignore-scripts  # Skip post-install scripts too

浏览器的子资源完整性(SRI)

在网页中使用外部 CDN 资源时,SRI(Subresource Integrity)允许你在 HTML 中声明资源的哈希,浏览器会在加载时验证该哈希,如果 CDN 被篡改,浏览器会拒绝加载:

<!-- SRI: Browser verifies the hash before executing -->

建立验证习惯

验证文件完整性不应该是偶尔为之,而应该成为习惯:下载操作系统 ISO 总是验证 SHA256;从非官方镜像下载软件时,额外验证 GPG 签名;在 CI/CD 中对所有外部依赖进行哈希锁定;对于生产系统,将哈希验证纳入部署流程。这些习惯能有效降低供应链攻击的风险。

立即免费使用相关工具

免费使用 →