被換過的檔案和原版看起來一模一樣:同樣的名字、同樣的大小、同樣的圖標。能把它們分開的只有校驗和 (檔案內容的短指紋:改一個字節,整個指紋都變)。你下載的檔案的校驗和與作者公佈的一致,那就是同一個檔案。不一致,那就是另一個檔案,不要運行。下面講:替換是從哪兒來的,怎麼一秒鐘算出校驗和,參考值該從哪兒拿,校驗才有意義。
| 為什麼要比校驗和 | |
|---|---|
| 作者那兒的檔案 | SHA-256: a3f9… |
| 你這兒的檔案 | SHA-256: a3f9… 一樣 |
| 你這兒的檔案 | SHA-256: 71c0… 不一樣 |
| 名字和大小 | 可以一樣 |
| 校驗和 | 不可能碰巧一樣 |
哈希是什麼,最簡單的説法
拿任何一個檔案,哪怕一個 GB,過一遍公式。出來的永遠是 64 個字符,同一個檔案永遠是同樣的 64 個。檔案裏改一個字節,64 個字符全變,和原來的毫無關係。從這些字符倒推不迴檔案,但用它們比較兩個檔案只要一秒,不用比檔案本身。
打個比方:它像指紋。看指紋認不出這個人長什麼樣,但兩枚指紋一比,就知道是不是同一個人。這就是哈希,也叫校驗和。作者用自己的檔案算出來並公佈。你用自己的檔案算出來,比一下。一致,兩個檔案到最後一個字節都相同。公式是公開的、全世界一樣的,所以 Windows 上算的校驗和可以和 Mac 或瀏覽器裏算的比。
替換是從哪兒來的
網站和你的硬盤之間有一段路,檔案可以在路上被換掉。「下載更快」的鏡像站。酒店裏被感染的路由器。往未加密網頁裏塞廣告的電訊商。有人坐在中間的公共 Wi-Fi。還有最常見的一種:你不是從官網下的,而是從「另一個地方,東西一樣」下的,以為它是一樣的。
HTTPS 擋得住前面幾種,擋不住最後一種。你自己去了別人的網站、自己下了別人的檔案,加密通道會忠實地把假貨送到你手上。校驗和給的答案很直接:這是不是作者發佈的那個檔案。
對 VPN 客戶端來説這一點尤其重要。一個即將拿到你全部流量權限的檔案,值得在安裝前查,而不是安裝後。從不明來源的應用程式商店裝安卓客戶端有什麼風險,在科學上網教程裏提過。
怎麼算校驗和
開啟檔案校驗和,把檔案拖進去。預設算 SHA-256 (標準的指紋算法,64 個字符),SHA-1、SHA-512 和 MD5 一鍵切換,看作者公佈的是哪種。檔案不會被上傳到任何地方:它在標籤頁的內存裏讀取,過程中沒有任何網絡請求,你可以在開發者工具的「網絡」標籤裏確認。
手裏有參考值的話,貼進旁邊的輸入框:頁面自己會説「一致」或「不一致」,不用你肉眼比 64 個字符。
在電腦上不用瀏覽器也行:
Windows: certutil -hashfile 檔案名 SHA256
macOS: shasum -a 256 檔案名
Linux: sha256sum 檔案名
任何系統結果都一樣。這就是全部意義:校驗和只取決於內容,不取決於誰用什麼算的。
參考值從哪兒拿
這裏是最常出錯的地方。參考值要從你信任的來源拿,而不是從你拿到那個可疑檔案的同一個地方。檔案在鏡像站上被換了,旁邊的校驗和也一起被換了,它們會「一致」。那樣的校驗毫無意義。
正確的做法:檔案從哪兒來都行,校驗和從作者的官網拿。我們在每個下載旁邊都放了一個 .sha256 檔案:404vpn.apk.sha256、404vpn-macos.dmg.sha256、tunnel.apk.sha256。參考值就在裏面。從任何鏡像下了客戶端,去下載頁拿校驗和,比一下。
| 校驗和從哪兒來 | |
|---|---|
| 檔案和校驗和都來自鏡像 | 沒用 |
| 檔案來自鏡像,校驗和來自作者 | 真正的校驗 |
| 檔案和校驗和都來自作者 | 真正的校驗 |
| 規則 | 檔案不是作者給的,校驗和就必須是 |
校驗和不一致:説明什麼
説明這不是同一個檔案。原因有無害的和有害的,分辨起來很簡單。
無害的。 你下了另一個版本:作者更新了檔案、頁面上的校驗和還沒更新,或者反過來。下載沒下完。瀏覽器順手把壓縮包解開了。這幾種情況下,從官網重新下載就會一致。
有害的。 從同一個地方重新下了一遍,校驗和還是對不上作者的,而作者官網上的檔案對得上。説明那個地方放的是另一個檔案。裏面是什麼你不會知道,也不需要知道:不運行,刪掉。
一條簡單的規則:不一致不是「再仔細看一眼」,而是「一致之前不要運行」。
校驗和查不了什麼
校驗和只證明檔案從作者算出參考值那一刻起沒變過。它不説作者是否可信,也不説檔案有沒有 bug。你信任作者,校驗和就保證你拿到的是他的檔案。你不信任,校驗和幫不了你:它會用同樣的精度確認一個惡意檔案確實出自你錯信的那個人。
它也不能代替簽名。簽名還回答「這是誰發佈的」,校驗和只回答「是不是同一個東西」。對下載的應用來説,只要校驗和來自你信任的網站,通常夠用了。
説實話,我自己不會什麼都查。我查三類:拿到大權限的應用(VPN、殺毒、任何能碰系統的東西),鏡像站和種子下來的檔案,以及陌生人發來的連結裏的一切。花一秒,可能省下很多。
| 什麼時候必須查 | |
|---|---|
| 大權限的應用 | 查 |
| 鏡像站或種子下來的檔案 | 查 |
| 陌生人給的檔案 | 查 |
| 校驗和不是從檔案來源處拿的 | 這一條讓前三條有意義 |
校驗和對不上、又分不清原因是否無害,把兩個值和檔案的來龍去脈交給 AI。
幫我分析檔案校驗和為什麼對不上。
檔案:(是什麼,從哪兒下的)。
參考值來自:(作者官網 / 檔案旁邊 / 不清楚)。
我算的:(貼上)。參考值:(貼上)。
重新下過:(下過,還是一樣 / 沒有)。
告訴我這更像是版本不同或沒下完,還是被換了,
下一步該做什麼。不要建議我運行這個檔案。
一句話總結
- 名字和大小能偽造,校驗和不能。
- 拖進去,拿到 SHA-256,和作者官網上的參考值比。
- 一致:就是那個檔案。不一致:不要運行。
- 最大的錯誤:參考值從可疑檔案的同一個來源拿,那樣校驗等於沒做。