abox.tools

語言: 繁體中文

怎樣用校驗和核對下載的檔案

下載連結底下那行十六進位放在那裡,是為了讓你能證明檔案是完好到達的。比對它大約花一分鐘。至於這次比對到底值多少,以及哪一個習慣會讓它一文不值,那要花掉這一頁的其餘部分。

開啟雜湊與校驗和 把下載來的檔案和釋出方公佈的那串數字對一下,不用把它發給任何人。

以 Markdown 檢視

簡短的回答

開啟雜湊與校驗和,把下載好的檔案拖進去,再把下載頁面上的校驗和貼到下面那個框裡。頁面會從長度看出那串數字是哪種演算法,然後用一句話回答。

對得上,說明你磁碟上的位元組就是釋出方量過的位元組。對不上,就先重新下載,再談開啟。下面寫的是這句話省掉的部分。

下載連結底下那串數字是什麼

是一個雜湊函式的輸出:一種讀遍檔案每一個位元組、給出一個又短又定長的答案的演算法。同一個檔案永遠給出同一個答案,而只差一個二進位位的檔案會給出完全不同的答案——不是相近的答案,是毫不相干的答案。整件事就靠這個性質撐著。

既然答案很短而檔案不短,這道算術就必然丟掉資訊,也就必然有很多檔案共用同一個答案。有意去找出其中一個,才是難的那一半;而難到什麼程度,正是下面這些演算法彼此的區別。

校驗和沒有什麼是保密的,也沒有辦法倒推回去。它是一枚指紋,公佈出來,好讓兩個人能就「我們手上是同一個東西」達成一致。

你面前的是哪一種

你不用挑。釋出方已經挑好了,你要做的是算出同一種。光看長度就能分辨:

沒有兩種長度相同,所以工具能夠在沒人告訴它的情況下認出你貼進來的是什麼。一串 63 個字元的東西不是任何東西的校驗和:那是一個在去剪貼簿的路上掉了一個字元的 SHA-256。

結果卡片:同一個檔案的 MD5、SHA-1、SHA-256 和 SHA-512 摘要,每個後面都有複製按鈕。
一次全給出來,因為該用哪一個是釋出檔案的一方定的,不是你定的。

不用瀏覽器,在自己機器上做

每個作業系統都內建能做這件事的工具,而且就算你用網頁來做,知道這條命令也值得。對於「我怎麼知道你們站算得老實不老實」這個問題,沒有比把同一個檔案餵給你自己電腦內建的工具更好的回答了。

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-…"。然後用一句話回答是或不是。

比對卡片:一串校驗值被貼進輸入框,下面給出與檔案相符的判定。
把下載頁面上寫的那串貼進來,比對交給工具。盯著螢幕數六十四個字元,正是它要省掉的那一步。

對上了,究竟證明了什麼

證明你磁碟上的這些位元組,就是某個人寫下那串數字時手邊的那些位元組。這確實值得知道,也比多數人以為的要窄,所以值得把它管得著和管不著的分別列出來。

對上了,可以排除:

對上了,排除不了:

讓整件事白做的那個錯誤

從和檔案同一個頁面、同一條連線上取校驗和。

想一想你在防什麼。如果擔心的是下載壞了,校驗和從哪裡來都行,這次核對是有效的。如果擔心的是有人動過這個檔案,那麼能換掉檔案的人也能換掉印在下面的那行十六進位,因為兩者來自同一臺伺服器、同一條連線。你等於是在請偽造者確認簽名。

校驗和最值錢的時候,是它走的路和檔案不同的時候:

這些都不意味著核對同頁面上的校驗和就沒用了。它抓得住壞掉的下載,而那正是真會落到人身上的故障。只是別對自己說它還抓住了別的什麼。

MD5 和 SHA-1 已經破了。有時候還是照用

兩者都在這裡要緊的那個最強意義上破了:碰撞可以被刻意造出來。同一個 MD5 的兩個不同檔案,從 2004 年起用普通硬體就能做出來;2017 年一個團隊做出了同一個 SHA-1 的兩份不同 PDF。到 2020 年,能自選字首的那種攻擊已經降到幾萬美元的租用運算能力。

落到實處就是:對上的 MD5 不再能告訴你沒人動過這個檔案,因為想動的人本來就能造出一個同值的另一個檔案。它仍然能告訴你下載沒有被截斷、沒有損壞,因為隨機的意外不會正好撞上一個碰撞——那種機率是任何意外都沒有過的。

所以,如果釋出方只印了一個 MD5,那就核對它:這比不核對強。而如果釋出的人是你,請印一個 SHA-256。

對不上,現在怎麼辦

  1. 重新下一次,還從同一個地方。斷掉或者續傳過的傳輸是遙遙領先的頭號原因,第二份副本通常就把事情了結了。
  2. 確認你比的是那一行。釋出頁面上會列好幾個檔案:安裝檔的校驗和永遠不會和壓縮包的對上,ARM 的也不會和 x86 的對上。
  3. 確認版本。收藏起來的校驗和頁面,在小版本釋出的那天就過期了。
  4. 換一個映象試試,再把兩份檔案的校驗和彼此對照。兩個映象彼此一致卻都和公佈的數字不同,和一個映象同時和另外兩者不同,是兩種不同的問題。
  5. 在弄清楚之前不要開啟它。一個通不過校驗和的檔案,往好裡說是損壞了,往壞裡說根本不是你要的那個檔案。

為什麼要在瀏覽器裡做

因為命令列不是大多數人待的地方;也因為那個顯而易見的替代方案——一個讓你把檔案傳上去的網站——用來對付一個你本來就在懷疑的安裝檔,是件很奇怪的事。為了弄清楚檔案有沒有在路上被動過手腳而把它發到別處,等於又多加了一個可以被動手腳的地方。

雜湊與校驗和按每次 4 MB 在你自己的機器上讀這個檔案,所以沒有上傳、沒有大小上限,除了頁面本身之外也沒有別的需要你信任的東西;而那個頁面你讀得到,拔掉網線它照樣工作。如果你更願意信自己的作業系統,就跑上面那一節的命令,再把兩個答案對一下。它們會一樣。