簡短的回答
開啟雜湊與校驗和,把下載好的檔案拖進去,再把下載頁面上的校驗和貼到下面那個框裡。頁面會從長度看出那串數字是哪種演算法,然後用一句話回答。
對得上,說明你磁碟上的位元組就是釋出方量過的位元組。對不上,就先重新下載,再談開啟。下面寫的是這句話省掉的部分。
下載連結底下那串數字是什麼
是一個雜湊函式的輸出:一種讀遍檔案每一個位元組、給出一個又短又定長的答案的演算法。同一個檔案永遠給出同一個答案,而只差一個二進位位的檔案會給出完全不同的答案——不是相近的答案,是毫不相干的答案。整件事就靠這個性質撐著。
既然答案很短而檔案不短,這道算術就必然丟掉資訊,也就必然有很多檔案共用同一個答案。有意去找出其中一個,才是難的那一半;而難到什麼程度,正是下面這些演算法彼此的區別。
校驗和沒有什麼是保密的,也沒有辦法倒推回去。它是一枚指紋,公佈出來,好讓兩個人能就「我們手上是同一個東西」達成一致。
你面前的是哪一種
你不用挑。釋出方已經挑好了,你要做的是算出同一種。光看長度就能分辨:
- 32 個十六進位字元 — MD5.
- 40 — SHA-1.
- 64 — SHA-256,這也是你最常見到的一種。
- 96 — SHA-384.
- 128 — SHA-512.
沒有兩種長度相同,所以工具能夠在沒人告訴它的情況下認出你貼進來的是什麼。一串 63 個字元的東西不是任何東西的校驗和:那是一個在去剪貼簿的路上掉了一個字元的 SHA-256。
不用瀏覽器,在自己機器上做
每個作業系統都內建能做這件事的工具,而且就算你用網頁來做,知道這條命令也值得。對於「我怎麼知道你們站算得老實不老實」這個問題,沒有比把同一個檔案餵給你自己電腦內建的工具更好的回答了。
Windows,在 PowerShell 裡:
Get-FileHash .\disk.iso -Algorithm SHA256 更老的機器上是 certutil -hashfile disk.iso SHA256,它輸出大寫並且帶空格。比對校驗和時大小寫從來無關緊要:那些字母是數字,不是詞。
macOS:
shasum -a 256 disk.iso Linux:
sha256sum disk.iso 這三條對同一個檔案列印出同一串字元,本站也一樣。它們是有公開測試向量的嚴格規範,不給實現留下發表意見的餘地。
別把眼睛看花
不要在兩塊螢幕上各讀六十四個字元,然後判斷它們看起來一樣。人只會看頭四個和尾四個就收手,而這恰好是攻擊者會安排透過的那種比對,也是善意的疏忽混過去的方式。
把兩邊都貼進一個能替你比的東西裡。在命令列上,-c 就是做這個的:
sha256sum -c SHA256SUMS 在瀏覽器裡,就是雜湊與校驗和的比對框。它按釋出方寫下來的樣子收:光是十六進位、sha256sum 的一行、整份 SHA256SUMS 檔案、SHA256 (disk.iso) = … 這種寫法,或者從 script 標籤上扒下來的 integrity="sha384-…"。然後用一句話回答是或不是。
對上了,究竟證明了什麼
證明你磁碟上的這些位元組,就是某個人寫下那串數字時手邊的那些位元組。這確實值得知道,也比多數人以為的要窄,所以值得把它管得著和管不著的分別列出來。
對上了,可以排除:
- 一次提前停住、卻給你留下一個看起來完整的檔案的下載;
- 傳輸途中、快壞的硬碟上,或者一根劣質 USB 線造成的損壞;
- 拿錯了檔案:本該 x86 卻拿了 ARM,或者拿的是上個月的釋出;
- 一個不聲不響地發著與它所宣稱不同的東西的映象站。
對上了,排除不了:
- 這個檔案是惡意的。釋出方量惡意軟體和量別的東西一樣準。校驗和說的是「這就是他們發出來的東西」,從來不是「這個東西安全」;
- 釋出方本身被攻破了。能把伺服器上的檔案換掉的人,會在同一分鐘裡把下面那行校驗和也換掉。這就說到下一節了。
讓整件事白做的那個錯誤
從和檔案同一個頁面、同一條連線上取校驗和。
想一想你在防什麼。如果擔心的是下載壞了,校驗和從哪裡來都行,這次核對是有效的。如果擔心的是有人動過這個檔案,那麼能換掉檔案的人也能換掉印在下面的那行十六進位,因為兩者來自同一臺伺服器、同一條連線。你等於是在請偽造者確認簽名。
校驗和最值錢的時候,是它走的路和檔案不同的時候:
- 一份帶分離 GPG 簽名的
SHA256SUMS,用你本來就有的金鑰去驗。發行版就是這麼做的,這才是真正的答案; - 從郵件列表的釋出公告或者原始碼儲存庫的標籤上取,而不是從下載頁面上取;
- 從另一個域名下的第二個映象取一份,再把兩份彼此對照;
- 交給包管理器,它會用隨作業系統一起來的金鑰替你做這件事。
這些都不意味著核對同頁面上的校驗和就沒用了。它抓得住壞掉的下載,而那正是真會落到人身上的故障。只是別對自己說它還抓住了別的什麼。
MD5 和 SHA-1 已經破了。有時候還是照用
兩者都在這裡要緊的那個最強意義上破了:碰撞可以被刻意造出來。同一個 MD5 的兩個不同檔案,從 2004 年起用普通硬體就能做出來;2017 年一個團隊做出了同一個 SHA-1 的兩份不同 PDF。到 2020 年,能自選字首的那種攻擊已經降到幾萬美元的租用運算能力。
落到實處就是:對上的 MD5 不再能告訴你沒人動過這個檔案,因為想動的人本來就能造出一個同值的另一個檔案。它仍然能告訴你下載沒有被截斷、沒有損壞,因為隨機的意外不會正好撞上一個碰撞——那種機率是任何意外都沒有過的。
所以,如果釋出方只印了一個 MD5,那就核對它:這比不核對強。而如果釋出的人是你,請印一個 SHA-256。
對不上,現在怎麼辦
- 重新下一次,還從同一個地方。斷掉或者續傳過的傳輸是遙遙領先的頭號原因,第二份副本通常就把事情了結了。
- 確認你比的是那一行。釋出頁面上會列好幾個檔案:安裝檔的校驗和永遠不會和壓縮包的對上,ARM 的也不會和 x86 的對上。
- 確認版本。收藏起來的校驗和頁面,在小版本釋出的那天就過期了。
- 換一個映象試試,再把兩份檔案的校驗和彼此對照。兩個映象彼此一致卻都和公佈的數字不同,和一個映象同時和另外兩者不同,是兩種不同的問題。
- 在弄清楚之前不要開啟它。一個通不過校驗和的檔案,往好裡說是損壞了,往壞裡說根本不是你要的那個檔案。
為什麼要在瀏覽器裡做
因為命令列不是大多數人待的地方;也因為那個顯而易見的替代方案——一個讓你把檔案傳上去的網站——用來對付一個你本來就在懷疑的安裝檔,是件很奇怪的事。為了弄清楚檔案有沒有在路上被動過手腳而把它發到別處,等於又多加了一個可以被動手腳的地方。
雜湊與校驗和按每次 4 MB 在你自己的機器上讀這個檔案,所以沒有上傳、沒有大小上限,除了頁面本身之外也沒有別的需要你信任的東西;而那個頁面你讀得到,拔掉網線它照樣工作。如果你更願意信自己的作業系統,就跑上面那一節的命令,再把兩個答案對一下。它們會一樣。