在 Linux 環境下編譯安裝軟體、部署生產系統時,驗證下載檔案完整性是防範供應鏈攻擊、傳輸損壞的關鍵防線。本文系統介紹三種主流驗證機制的原理、操作與最佳實踐。
MD5 產生 128 位(32 字元十六進制)雜湊值,理論上不同檔案雜湊值唯一。但 MD5 已被證實存在碰撞攻擊漏洞,不適用於安全敏感場景,僅適合檢測非惡意損壞。
# 產生雜湊值
md5sum your-downloaded-file.tar.gz
# 輸出:d41d8cd98f00b204e9800998ecf8427e your-downloaded-file.tar.gz
# 存檔備份
md5sum your-downloaded-file.tar.gz > file.md5
# 驗證(需在同目錄下執行)
md5sum -c file.md5
# 輸出:your-downloaded-file.tar.gz: OK
# 產生多檔案清單
md5sum file1.tar.gz file2.tar.gz file3.tar.gz > all_files.md5
# 一次驗證全部
md5sum -c all_files.md5
SHA-1 產生 160 位(40 字元)雜湊值,比 MD5 更抗碰撞。但 SHA-1 亦已被理論攻擊破解,新專案建議使用 SHA-256 或更強。
# 產生 SHA1
sha1sum your-downloaded-file.tar.gz
# 輸出:da39a3ee5e6b4b0d3255bfef95601890afd80709 your-downloaded-file.tar.gz
# 驗證流程同 MD5
sha1sum your-downloaded-file.tar.gz > file.sha1
sha1sum -c file.sha1
sha256sum your-file.tar.gz # 256 位,最常用
sha384sum your-file.tar.gz # 384 位
sha512sum your-file.tar.gz # 512 位,最高強度
# 驗證方式相同
sha256sum -c file.sha256
.asc 或 .sig 簽名檔# 方式 A:從金鑰伺服器下載(需知道金鑰 ID)
gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0xABCDEF1234567890
# 方式 B:從官網下載公鑰檔案並匯入
wget https://example.com/release-key.asc
gpg --import release-key.asc
# 方式 C:使用 WKD (Web Key Directory) 自動發現
gpg --auto-key-locate wkd --locate-keys maintainer@example.com
# 下載檔案與簽名檔
wget https://example.com/software-1.0.tar.gz
wget https://example.com/software-1.0.tar.gz.asc
# 驗證
gpg --verify software-1.0.tar.gz.asc software-1.0.tar.gz
gpg: Signature made Mon 01 Jan 2024 12:00:00 PM CST
gpg: using RSA key 0xABCDEF1234567890
gpg: Good signature from "Software Maintainer " [ultimate]
gpg: aka "Project Signing Key " [unknown]
GPG 預設不信任匯入的公鑰,必須透過指紋驗證確認公鑰真實性:
# 顯示公鑰指紋
gpg --fingerprint 0xABCDEF1234567890
# 輸出:Key fingerprint = 1234 5678 90AB CDEF 1234 5678 90AB CDEF 1234 5678
# 與官網發布的指紋比對(官網、發布郵件、GitHub Release 頁面)
# 確認一致後,簽署信任
gpg --sign-key 0xABCDEF1234567890
# 選擇信任等級:3 = 完全信任
| 維度 | MD5 | SHA-256 | PGP/GPG |
|---|---|---|---|
| 抗碰撞強度 | 弱(已破解) | 強(目前安全) | 極強(依賴私鑰保護) |
| 身份驗證 | 無 | 無 | 有(確認發布者身份) |
| 操作複雜度 | 極低 | 低 | 中(需管理金鑰) |
| 適用場景 | 非關鍵檔案快速校驗 | 一般軟體發布、CI/CD 成果物 | 核心基礎設施、安全敏感軟體、法律效力 |
#!/bin/bash
# verify.sh - 自動驗證下載檔案
set -euo pipefail
FILE=$1
EXPECTED_HASH=$2
ALGO=${3:-sha256}
case $ALGO in
md5) CMD="md5sum" ;;
sha1) CMD="sha1sum" ;;
sha256) CMD="sha256sum" ;;
*) echo "Unsupported algorithm"; exit 1 ;;
esac
ACTUAL_HASH=$($CMD "$FILE" | awk '{print $1}')
if [[ "$ACTUAL_HASH" == "$EXPECTED_HASH" ]]; then
echo "✅ Verification PASSED ($ALGO)"
exit 0
else
echo "❌ Verification FAILED ($ALGO)"
echo "Expected: $EXPECTED_HASH"
echo "Actual : $ACTUAL_HASH"
exit 1
fi
使用:./verify.sh file.tar.gz abc123... sha256
md5sum -c 要求檔案路徑與清單中一致,建議在檔案目錄下執行md5sum -b 二進位模式Good signature 但有信任警告時,必須驗證指紋,否則可能遭受中間人攻擊
檔案完整性驗證不是可選項,是專業運維的底線。建立「下載即驗證」的肌肉記憶,配合自動化腳本納入 CI/CD 流程,才能在供應鏈攻擊日益頻繁的今天守住最後一道防線。