用校驗碼驗證下載與檔案完整性
加密雜湊究竟證明什麼、為什麼 MD5 和 SHA-1 如今只能用於完整性、一步步核驗安裝包,以及如何在本機計算敏感文字的雜湊而不上傳。
完整性,而非來源真實性
加密哈希把輸入變成定長指紋。哪怕只改變一個比特,摘要也極有可能變化;可信的現代摘要匹配是兩份檔案位元組相同的強證據。
- 完整性證據可信的 SHA-256 摘要匹配,是你的副本與發佈檔案位元組相同的強證據;它本身不能證明誰發佈了檔案。
- 真實性另算真實性不在其列:印在下載旁邊的校驗碼說明不了檔案是誰寫的——能替換下載的攻擊者也能替換印出來的校驗碼。
- 簽章是另一種工具真實性需要另一套機制:用你已信任的金鑰驗證簽章,或者經由比下載本身更可信的管道遞送校驗碼。
MD5 與 SHA-1 如今只用於完整性
MD5 產出 128 位元摘要,寫作 32 個十六進位字元;SHA-1 產出 160 位元,40 個字元。兩者都很快,用來發現意外損壞都沒問題——但兩者都已有公開演示的碰撞,因此都無法抵抗刻意構造同摘要惡意檔案的攻擊者。
實用規則:MD5 或 SHA-1 相符仍然能抓住截斷的下載或出故障的磁碟,因為意外不會去計算碰撞。這些演算法再也做不到的,是為你有理由懷疑的檔案背書——這個判斷如今屬於 SHA-256 或更強的演算法。
- MD5 已破MD5 碰撞多年來都已切實可行:可以故意構造出 MD5 摘要相同的兩個不同檔案,MD5 已無法區分意外與攻擊。
- SHA-1 已破SHA-1 走了同一條路:一次公開演示的碰撞終結了它作為安全基元的壽命,瀏覽器、憑證機構與程式碼託管平台都已離開它。
- SHA-2 是基線SHA-2 家族是現行基線:SHA-256(64 個十六進位字元)是發佈下載校驗碼的預設選擇,SHA-224、SHA-384 與 SHA-512(56、96、128 個字元)是適應不同限制的兄弟。
一步步核驗安裝包
整個檢查不到一分鐘,用的都是機器上已有的工具。順序很重要:從發佈者的官方頁面取得期望摘要,雜湊本機副本,逐字元比對。
不符並不總是惡意——截斷的下載與快取代理經常損壞檔案——但反應是一樣的:檔案未通過核驗,唯一正確的下一步是從來源取得新副本。
- 取得期望值在廠商官方下載或發佈頁面找到公佈的校驗碼——最好是 HTTPS 上你親自導覽到的網域,而不是鏡像站或搜尋結果摘要。
- 本機雜湊本機雜湊下載的檔案:macOS 或 Linux 上用 shasum -a 256,Windows 上用 PowerShell 的 Get-FileHash。兩者都在你的磁碟上執行,沒有任何上傳。
- 精確比對不區分大小寫地逐字元比對完整摘要。只要有一個字元不同,就丟棄檔案並從來源重新取得——不要裝上它然後祈禱。
不上傳,也能雜湊敏感文字
很多真實的檢查對象是文字而不是檔案:一段設定片段、一枚授權金鑰、一段權杖碎片、同事在電話裡念出的一個值。把它們貼進隨便一個網站,就是交給了別人的日誌,所以雜湊必須在本機發生。
SHA-256 雜湊產生與驗證涵蓋當前 64 字元的發佈校驗碼標準。這裡的驗證是比對而非解密:對你的文字做雜湊,然後在瀏覽器內比較兩個值。
- 本機設計文字按 UTF-8 原樣計算,不做正規化(上限 1 MiB)。檔案按原始位元組分塊計算,每塊 1 MiB、總量上限 256 MiB,支援空檔案。摘要相符無法認證來源;MD5 和 SHA-1 不適合對抗惡意竄改的完整性核驗。本機 Worker 支援取消,執行預算為 15 秒。
- 顯式比對驗證模式是顯式比對:貼上期望摘要,工作區報告相符或不符,並預先拒絕格式錯誤的值——MD5 必須恰好 32 個十六進位字元,SHA-256 恰好 64 個。
- 單向構造摘要無法解密,但短小或可預測的輸入可被猜測後重新計算摘要。不要用未加鹽的通用哈希保護密碼或其他低熵秘密。
把比對變成例程的一部分
校驗碼只有在比對成為習慣而非事後補救時才有效。幾條小紀律能讓每次檢查都可靠。
從 UTF-8 文字或檔案原始位元組建立或比對十六進位摘要。 驗證在本機比對所選輸入的摘要,不解密摘要,也不認證資料來源。
- 完整比對逐字比對完整摘要。只檢查少數字元會削弱任何摘要校驗;MD5 與 SHA-1 即使比對完整摘要,也可能出現碰撞。
- 註明演算法讓演算法名跟著摘要走:64 個十六進位字元可能來自好幾種演算法,沒有標註的校驗碼只會引人瞎猜。
- 每跳重算檔案每經過一次 USB 隨身碟、同步用戶端或郵件搬運就重新雜湊;每一跳都是新的損壞機會,而摘要隨行的成本為零。
為你自己的檔案發佈校驗碼
如果你在散佈檔案——發佈二進位檔、資料集、內部工具——請隨檔案發佈校驗碼。每個產物只需一條指令,就能讓每位接收者不必聯絡你也能驗證完整性。
需要更長形式時,SHA-512 雜湊產生與驗證在本機產出 128 字元摘要,SHA-224 與 SHA-384 兩個兄弟涵蓋 SHA-2 家族其餘成員——同一個引擎,同一個分頁,同一條邊界。
- SHA-256 起步至少發佈 SHA-256;當你的受眾在 SHA-512 更快的平台上驗證時,並排加上它,並給每個摘要標註演算法。
- 同一信任層級校驗碼要與下載本身處在同一信任層級,最好放在使用者已經認可的頁面或儲存庫裡。
- MD5 僅作遺留標註MD5 只保留為遺留相容標註,明確標記為針對意外損壞的完整性檢查——絕不當安全驗證用。
常見問題
SHA-256 檢查碼到底能證明什麼?
MD5 和 SHA-1 現在還安全嗎?
如何在自己的機器上驗證下載的安裝程式?
核驗只是信任工具的一環。
學會在把檔案交給任何線上工具之前檢查它的資料路徑——這正是校驗碼所獎勵的那份懷疑精神。