跳轉到

檔案雜湊比對

什麼時候用得上

檔案不經過網路送出去的時候,收到的人沒有辦法確認取得的是不是完整的那一份。

  • 隨身碟或記憶卡帶過去。中途換過手、放在包包裡壓到、拔的時候還在寫入,這些都會讓檔案壞掉,而壞掉的檔案打得開的機率比想像中高,只是內容少一段
  • 託人帶過去。你要確認的是送到的那份跟你手上的一樣
  • 下載回來的安裝檔。Tor Browser、Tails 這類軟體都會公布雜湊,比對過再安裝
  • 兩台裝置之間搬完東西。用 QR code 影格串流或別的方式搬完,比一次確認拼回來的內容完整

斷網的時候這件事更重要,見網路中斷時的準備與應對。實體遞送在那種情況下是主要的管道,而收件的人沒有第二次機會回頭要一份。

相符代表什麼

兩份檔案算出同一個 SHA-256,內容就是一模一樣的,一個位元組都不差。要刻意做出兩份內容不同、SHA-256 相同的檔案,目前公開的研究做不到。

不相符代表內容有差異。差異的來源可能是傳輸中斷、儲存媒體壞了,也可能是有人動過。雜湊本身分不出是哪一種。

這個做法的前提

比對的價值全部建立在一件事上:你手上那串雜湊,確實是對方算出來的那一串。

能換掉檔案的人,通常也能換掉跟檔案放在一起的雜湊。把 hash.txt 跟檔案一起放進隨身碟,兩個一起被換掉,比對照樣相符。

所以雜湊要走跟檔案不同的一條路:當面唸、打電話、用已經確認過對方身分的通訊軟體傳。這跟斷網情境頁裡「備援管道要走不同的路」是同一個道理,失效條件不同才有意義。

六十四個字唸起來很長。實務上唸前八個字與後八個字就足以擋掉意外損壞與隨手替換,要防的是有能力針對你做前置計算的對手時,才需要整串核對。

加密與雜湊比對是兩件事

本機檔案加密防的是內容被看到,雜湊比對確認的是內容沒有變。兩件事互相獨立,加密過的檔案一樣可以算雜湊,而且應該對加密後的檔案算,那才是實際被搬運的東西。

為什麼是 SHA-256

MD5SHA-1 都已經有公開的碰撞範例,可以做出兩份不同的檔案算出同一個值,拿來確認檔案有沒有被動過已經不安全。這一頁只做 SHA-256。

軟體發布方公布的多半也是 SHA-256。看到 MD5 的雜湊時,多半代表那份發布資訊已經很舊。

幾 GB 的檔案也算得動

瀏覽器內建的雜湊介面要一次讀進整份檔案,手機上讀一份幾 GB 的影片會直接失敗,而失敗的樣子是分頁沒有反應。

這一頁自己實作 SHA-256,一塊一塊讀進來算,記憶體用量固定,過程中會顯示進度。自己實作的風險是算錯了畫面看起來一樣正常,所以 tools/test_hash.mjs 用三組互相獨立的來源交叉驗證:NIST 公布的標準測試向量、Node 內建的 crypto 模組,以及同一份資料切成不同大小餵進去必須算出同一個值。

不用這一頁也做得到

命令列本來就有,而且不必信任任何網頁:

  • Linux 與多數 BSD:sha256sum <檔案>
  • macOS:shasum -a 256 <檔案>
  • Windows PowerShell:Get-FileHash <檔案>

三個指令算出來的值跟這一頁一樣。這一頁存在的理由是手上只有瀏覽器的時候,例如借來的電腦、平板、或是不熟悉命令列的夥伴。

貼什麼格式都認得

對方給的雜湊可能是單獨一串字、sha256sum 的輸出(雜湊、兩個空格、檔名),也可能是一整份清單。整段貼進來就好,工具會把裡面所有 SHA-256 的段落抽出來,再看你的檔案算出的值在不在裡面。大小寫都認得。

離線可用

跟這一區其他工具一樣,程式存進裝置之後沒有網路也能用。實體遞送的場合本來就常常沒有網路,要把這一頁帶著走,見離線閱讀

檔案在你的瀏覽器裡計算,沒有上傳,也沒有寫進裝置的任何儲存空間。關掉頁面就沒了。