你在下載 Ubuntu ISO、Python 安裝程式或任何開源軟體時,官方頁面幾乎都會附上一串像 3b4f...c9a2 的文字,旁邊寫著「SHA-256」或「MD5」。這就是 checksum(校驗碼)——一種讓你在不信任網路的情況下,仍能確認下載到的檔案完好無缺的機制。本文聚焦在實務應用:如何計算、如何比對、以及不同場景下該選哪種演算法。
1. 什麼是 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. 最常見的使用場景:軟體下載驗證
當你從官方網站下載檔案時,完整的驗證流程如下:
- 下載檔案:取得安裝包(如
ubuntu-24.04.iso) - 取得官方 checksum:從同一官方頁面找到對應的 SHA-256 值,通常是一個 64 字元的十六進位字串
- 在本機計算 checksum:用工具對下載的檔案計算 SHA-256
- 逐字元比對:兩個值完全一致,表示檔案完整;任何差異都意味著檔案可能損壞或被竄改
下載鏈路中可能有多個 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 是資料完整性驗證最簡單、最通用的工具。選擇要點只有三條:
- 新系統一律 SHA-256:速度夠快,安全邊際足夠,各平台工具支援完整
- MD5 僅用於非安全場景:如果只是快速比對兩個本地檔案是否相同,MD5 無妨;但只要涉及安全(防止竄改),就用 SHA-256
- 下載軟體務必驗證:養成習慣,在安裝任何從網路下載的軟體前先比對 checksum,這是最簡單卻最有效的供應鏈安全措施