短い答え
ハッシュとチェックサムを開き、ダウンロードしたファイルをそこへ落として、ダウンロードページのチェックサムを下の欄に貼り付けます。ページは長さからどの方式かを判断し、一文で答えます。
一致すれば、手元のバイト列は配布元が測ったバイト列と同じです。一致しなければ、開く前にもう一度ダウンロードしてください。以下は、その一文が省いている話です。
ダウンロードリンクの下にある数字の正体
ハッシュ関数の出力です。ファイルのすべてのバイトを読み、短い固定長の答えを出す計算のことです。同じファイルなら必ず同じ答えになり、1ビットでも違うファイルはまったく違う答えになります。似た答えではなく、無関係な答えです。この性質がすべての土台です。
答えは短く、ファイルは短くないので、計算は情報を捨てています。したがって、どの答えについても、それを共有するファイルは必ずたくさん存在します。その一つを狙って見つけることが難しい部分で、その難しさが下に並ぶ方式どうしの違いです。
チェックサムに秘密はなく、逆算もできません。二人が同じものを持っていると確かめ合えるように公開された、指紋のようなものです。
いま見ているのがどの方式か
選ぶ必要はありません。配布元がすでに選んでいて、あなたの仕事は同じものを計算することです。見分けは長さだけでつきます。
- 十六進数32文字 — MD5.
- 40 — SHA-1.
- 64 — SHA-256。いちばんよく見るのがこれです。
- 96 — SHA-384.
- 128 — SHA-512.
同じ長さのものは二つとありません。だから、貼り付けられた値がどれなのかを、何も教えられなくても道具の側で判断できます。63文字の文字列は何のチェックサムでもありません。クリップボードへ運ばれる途中で一文字落ちた SHA-256 です。
ブラウザーを使わず、自分の機械で
どのOSにもこれをする道具が入っています。ページを使うにしても、コマンドを知っておく価値はあります。「このサイトが正直に計算した証拠は」という問いに対しては、同じファイルを手元の機械に付属する道具に通すこと以上の答えはありません。
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ファイルを、すでに持っていた鍵で検証します。ディストリビューションがやっているのはこれで、これが本来の答えです。 - ダウンロードページではなく、メーリングリストのリリース告知やソースリポジトリのタグから受け取る。
- 別ドメインの二つめのミラーから取り、二つを互いに突き合わせる。
- パッケージマネージャーに任せる。OSに同梱された鍵を使って、同じことを代わりにやってくれます。
とはいえ、同じページのチェックサムを確認することが無意味になるわけではありません。壊れたダウンロードは捕まえられますし、実際に人の身に起きるのはそちらです。ただ、それ以上のものを捕まえたと思い込まないことです。
MD5 と SHA-1 は破られています。それでも使うときがある
どちらも、ここで問題になる最も強い意味で破られています。衝突を狙って作れる、ということです。同じ MD5 を持つ別々のファイルは2004年から普通の機械で作れますし、2017年にはあるチームが同じ SHA-1 を持つ別々の PDF を作ってみせました。2020年には、前半を自由に選べる版の攻撃が、借りた計算資源で数万ドルまで下がりました。
実際の意味はこうです。一致した MD5 は、もう「誰も手を加えていない」ことを示しません。その気になれば、同じ数字を持つ別のファイルを作れたからです。一方で、ダウンロードが途中で切れていないこと、壊れていないことは、いまも示します。偶然の事故が衝突に当たることはないからです。そんな確率の事故は起きたためしがありません。
ですから、配布元が MD5 しか出していないなら確認してください。確認しないよりましです。そして自分が配布する側なら、SHA-256 を出してください。
一致しなかったら
- 同じ場所からもう一度ダウンロードします。途中で切れた、あるいは再開した転送が圧倒的に多い原因で、二度目のコピーでたいてい片が付きます。
- 照らし合わせている行が正しいか確かめる。リリースページには複数のファイルが並びます。インストーラーのチェックサムが書庫のものと一致することはありませんし、ARM版がx86版と一致することもありません。
- 版を確かめる。ブックマークしたチェックサムのページは、マイナーリリースが出た日に古くなります。
- 別のミラーを試し、二つのファイルのチェックサムを互いに比べる。二つのミラーが互いに一致していて公開された数字とだけ食い違うのは、一つのミラーが両方と食い違うのとは別の問題です。
- そのあいだ、ファイルを開きません。チェックサムに合わないファイルは、よくて壊れており、悪ければ頼んだものとは別物です。
そもそもなぜブラウザーで
多くの人がいる場所はコマンドラインではないからです。そして、思いつくもう一つの手段、つまりファイルのアップロードを求めるサイトというのは、すでに疑っているインストーラーの扱い方として奇妙だからです。途中で改ざんされていないかを調べるためにファイルをどこかへ送るのは、改ざんされうる場所をもう一つ増やすことです。
ハッシュとチェックサムは、ファイルを4メガバイトずつ、あなたの機械の上で読みます。アップロードはなく、サイズの上限もなく、信用しなければならないものはページ自体だけです。そのページは読めますし、ネットワークを抜いても動き続けます。自分のOSのほうを信用したいなら、上の節のコマンドを実行して二つの答えを見比べてください。一致します。