Checksum 完整指南:檔案完整性驗證、演算法選擇與下載安全實務

你在下載 Ubuntu ISO、Python 安裝程式或任何開源軟體時,官方頁面幾乎都會附上一串像 3b4f...c9a2 的文字,旁邊寫著「SHA-256」或「MD5」。這就是 checksum(校驗碼)——一種讓你在不信任網路的情況下,仍能確認下載到的檔案完好無缺的機制。本文聚焦在實務應用:如何計算、如何比對、以及不同場景下該選哪種演算法。

1. 什麼是 Checksum?

Checksum 是將任意長度的資料通過特定演算法,計算出一個固定長度的「摘要值」。這個值就像資料的指紋:

  • 相同的資料,每次計算的結果必然相同
  • 只要資料有任何一個位元改變,輸出值就會截然不同
  • 從輸出值無法反推原始資料(單向性)

這讓 checksum 成為驗證資料完整性的理想工具——無論是確認下載過程中沒有損壞,還是偵測檔案是否被惡意竄改。

Checksum ≠ 加密
Checksum 是單向雜湊,沒有「解密」這個概念。它的目的是驗證資料是否改變,而非保護資料內容不被看見。要同時保護資料的機密性,需要搭配 AES 等加密演算法。

2. Checksum 的三種層次

並非所有 checksum 都適合用在安全場景。依照演算法設計目的,大致可分為三層:

類型代表演算法輸出長度設計目的適用場景
非加密雜湊 CRC32 32 bit(8 個十六進位字元) 偵測傳輸錯誤 ZIP 壓縮檔完整性、乙太網路封包校驗
舊有密碼雜湊 MD5 128 bit(32 個字元) 最初設計用於安全,現已有碰撞漏洞 非安全性的快速比對(不建議新系統使用)
現代密碼雜湊 SHA-256、SHA-512 256–512 bit(64–128 個字元) 安全的完整性驗證 軟體發佈、程式碼簽章、數位憑證

2.1 CRC32 為何不適合安全用途?

CRC32 的設計目標是快速偵測隨機的傳輸錯誤(如位元翻轉),而非抵禦刻意的惡意竄改。攻擊者可以輕易修改檔案內容,同時保持 CRC32 值不變。因此 CRC32 只能用於非惡意場景的完整性驗證。

3. 最常見的使用場景:軟體下載驗證

當你從官方網站下載檔案時,完整的驗證流程如下:

  1. 下載檔案:取得安裝包(如 ubuntu-24.04.iso
  2. 取得官方 checksum:從同一官方頁面找到對應的 SHA-256 值,通常是一個 64 字元的十六進位字串
  3. 在本機計算 checksum:用工具對下載的檔案計算 SHA-256
  4. 逐字元比對:兩個值完全一致,表示檔案完整;任何差異都意味著檔案可能損壞或被竄改
為什麼這很重要?
下載鏈路中可能有多個 CDN 節點,任何一個環節出現問題(硬碟損壞、網路錯誤、甚至惡意替換)都會讓你得到一個有問題的檔案。Checksum 讓你在安裝前就能發現這些問題,而不是在系統壞掉之後才後悔。

4. 各平台的計算方式(命令列)

無需額外安裝軟體,主流作業系統都內建了 checksum 計算工具:

4.1 Windows

# certutil(內建,所有版本)
certutil -hashfile yourfile.iso SHA256
certutil -hashfile yourfile.iso MD5

# PowerShell(Windows 10+,更方便)
Get-FileHash yourfile.iso -Algorithm SHA256
Get-FileHash yourfile.iso -Algorithm SHA512
Get-FileHash yourfile.iso -Algorithm MD5

4.2 macOS

# shasum(內建)
shasum -a 256 yourfile.iso    # SHA-256
shasum -a 512 yourfile.iso    # SHA-512
shasum -a 1   yourfile.iso    # SHA-1(不建議)

# md5(內建)
md5 yourfile.iso

4.3 Linux

# sha256sum / sha512sum(所有發行版內建)
sha256sum yourfile.iso
sha512sum yourfile.iso
md5sum yourfile.iso    # MD5(不建議安全用途)

# 同時計算並比對(自動顯示 OK 或 FAILED)
echo "預期的hash值  yourfile.iso" | sha256sum --check

5. 瀏覽器工具:純前端計算的優勢

對於不熟悉命令列的使用者,線上校驗碼工具提供了更直觀的介面——只需拖曳檔案,即可立即取得各種演算法的 checksum 值。

你的檔案不會離開你的電腦
好的線上 checksum 工具會在瀏覽器本地端(JavaScript)完成計算,完全不需要將檔案上傳到任何伺服器。這表示即使是包含敏感資料的檔案,也能安全地使用工具驗證。計算完成後重新整理頁面,所有資料即消失。

瀏覽器工具特別適合以下場景:

  • 驗證大型 ISO 映像檔(幾 GB 的檔案同樣可以處理)
  • 企業環境中無法使用命令列的使用者
  • 一次需要同時取得多種演算法的值(MD5、SHA-1、SHA-256 等)

6. 演算法怎麼選?

不同場景對演算法有不同要求。以下是選擇的實務建議:

演算法輸出長度安全性建議
CRC32 8 字元 無(非密碼學設計) 僅用於偵測傳輸錯誤,不適合安全驗證
MD5 32 字元 已有碰撞(2004 年起) 僅用於快速非安全比對;不建議新系統使用
SHA-1 40 字元 已破解(SHAttered 2017) 棄用;遇到 SHA-1 checksum 盡量尋找 SHA-256 版本
SHA-256 64 字元 安全(目前無已知碰撞) 一般場景的首選,平衡速度與安全性
SHA-512 128 字元 更高安全邊際 高安全需求、或在 64 位元平台追求更快速度

簡單記憶原則:新系統一律用 SHA-256,只有在需要相容舊系統時才考慮 MD5,SHA-1 則應完全棄用。

7. 常見誤解澄清

7.1 Checksum 相同,代表檔案完全沒問題?

對 SHA-256 而言,目前沒有已知的碰撞攻擊,兩個不同檔案產生相同 SHA-256 的機率可忽略不計。但對於 MD5,攻擊者已可製造碰撞,因此「MD5 相同」無法保證檔案內容是你期望的版本。這也是為什麼現代軟體發佈幾乎都改用 SHA-256。

7.2 Checksum 能驗證檔案是「官方」發佈的嗎?

不能。Checksum 只驗證資料完整性(檔案有沒有被改過),無法驗證來源。若攻擊者能同時替換官方網站的檔案和 checksum,你仍會誤以為下載了正確的版本。

要驗證來源,需要使用數位簽章(如 GPG/PGP 簽章)——發行者用私鑰簽章,你用公鑰驗證。這比 checksum 更強,但也更複雜。

7.3 Checksum 只有下載驗證才用到嗎?

遠不止如此。Checksum 在許多場景中都是關鍵工具:

  • 備份驗證:定期計算備份檔案的 checksum,確認資料沒有靜默損壞(bit rot)
  • 資料庫遷移:遷移前後各計算一次 checksum,確認資料完整複製
  • API 傳輸:在 HTTP header 附上 checksum,讓接收方驗證 payload 沒有在傳輸途中損壞
  • 版本控制:Git 使用 SHA-1(舊)或 SHA-256(新)作為每個 commit 和物件的唯一識別符
  • 去重複(Deduplication):雲端儲存用 checksum 識別相同內容,避免重複儲存

8. 程式碼範例:計算檔案 SHA-256

# PHP
$hash = hash_file('sha256', '/path/to/file.iso');
echo $hash;  // 64 個十六進位字元

# 也支援其他演算法
hash_file('md5', $path);
hash_file('sha512', $path);

# Python(分塊讀取,適合大型檔案)
import hashlib

def sha256_file(path):
    h = hashlib.sha256()
    with open(path, 'rb') as f:
        for chunk in iter(lambda: f.read(65536), b''):
            h.update(chunk)
    return h.hexdigest()

print(sha256_file('/path/to/file.iso'))

# Node.js
const crypto = require('crypto')
const fs = require('fs')

function sha256File(path) {
    const hash = crypto.createHash('sha256')
    const data = fs.readFileSync(path)
    hash.update(data)
    return hash.digest('hex')
}

console.log(sha256File('/path/to/file.iso'))
大檔案的注意事項
對於幾 GB 的 ISO 映像檔,避免一次性讀取整個檔案到記憶體。Python 和 Node.js 範例中的分塊讀取(每次 64KB)方式,適用於任意大小的檔案,不會造成記憶體不足。

9. 小結

Checksum 是資料完整性驗證最簡單、最通用的工具。選擇要點只有三條:

  1. 新系統一律 SHA-256:速度夠快,安全邊際足夠,各平台工具支援完整
  2. MD5 僅用於非安全場景:如果只是快速比對兩個本地檔案是否相同,MD5 無妨;但只要涉及安全(防止竄改),就用 SHA-256
  3. 下載軟體務必驗證:養成習慣,在安裝任何從網路下載的軟體前先比對 checksum,這是最簡單卻最有效的供應鏈安全措施