檔案雜湊比對¶
什麼時候用得上¶
檔案不經過網路送出去的時候,收到的人沒有辦法確認取得的是不是完整的那一份。
- 隨身碟或記憶卡帶過去。中途換過手、放在包包裡壓到、拔的時候還在寫入,這些都會讓檔案壞掉,而壞掉的檔案打得開的機率比想像中高,只是內容少一段
- 託人帶過去。你要確認的是送到的那份跟你手上的一樣
- 下載回來的安裝檔。Tor Browser、Tails 這類軟體都會公布雜湊,比對過再安裝
- 兩台裝置之間搬完東西。用 QR code 影格串流或別的方式搬完,比一次確認拼回來的內容完整
斷網的時候這件事更重要,見網路中斷時的準備與應對。實體遞送在那種情況下是主要的管道,而收件的人沒有第二次機會回頭要一份。
相符代表什麼¶
兩份檔案算出同一個 SHA-256,內容就是一模一樣的,一個位元組都不差。要刻意做出兩份內容不同、SHA-256 相同的檔案,目前公開的研究做不到。
不相符代表內容有差異。差異的來源可能是傳輸中斷、儲存媒體壞了,也可能是有人動過。雜湊本身分不出是哪一種。
這個做法的前提¶
比對的價值全部建立在一件事上:你手上那串雜湊,確實是對方算出來的那一串。
能換掉檔案的人,通常也能換掉跟檔案放在一起的雜湊。把 hash.txt 跟檔案一起放進隨身碟,兩個一起被換掉,比對照樣相符。
所以雜湊要走跟檔案不同的一條路:當面唸、打電話、用已經確認過對方身分的通訊軟體傳。這跟斷網情境頁裡「備援管道要走不同的路」是同一個道理,失效條件不同才有意義。
六十四個字唸起來很長。實務上唸前八個字與後八個字就足以擋掉意外損壞與隨手替換,要防的是有能力針對你做前置計算的對手時,才需要整串核對。
加密與雜湊比對是兩件事¶
本機檔案加密防的是內容被看到,雜湊比對確認的是內容沒有變。兩件事互相獨立,加密過的檔案一樣可以算雜湊,而且應該對加密後的檔案算,那才是實際被搬運的東西。
為什麼是 SHA-256¶
MD5 與 SHA-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 的段落抽出來,再看你的檔案算出的值在不在裡面。大小寫都認得。
離線可用¶
跟這一區其他工具一樣,程式存進裝置之後沒有網路也能用。實體遞送的場合本來就常常沒有網路,要把這一頁帶著走,見離線閱讀。
檔案在你的瀏覽器裡計算,沒有上傳,也沒有寫進裝置的任何儲存空間。關掉頁面就沒了。