よくあるのは、配布ページのダウンロードリンクの横に SHA-256 が書かれていて、実行前に確かめたいがターミナルは開きたくない、という場面です。この記事では、照合で何がわかるのか、ブラウザーがファイルをアップロードせずにどうハッシュ値を計算するのか、値が合わないときにどうするかを説明します。
なぜチェックサムが必要なのか
暗号学的ハッシュ関数は、任意のバイト列から固定長の「指紋」を作ります。ダウンロードの検証に使うのは次の 2 つの性質です。
- 決定性:同じバイト列からは必ず同じハッシュ値が出る。
- 雪崩効果:入力のどこか 1 ビットが変わると、出力全体が変わる。
そのため、途中で切れたダウンロード、ミラー上で壊れたファイル、プロキシに書き換えられたファイルは、どれも SHA-256 が変わります。配布元の値と手元で計算した値を比べれば、再ダウンロードせずにこれらを見つけられます。
ただし、それだけでは出どころの証明にはなりません。それにはチェックサム一覧への署名が必要です。とはいえ「手元のファイルが配布元の一覧と同じ」ことは、その先のすべての前提です。
SHA-256 とレガシーアルゴリズムの違い
ZeroTool のファイルハッシュ値確認ツールは 6 種類のアルゴリズムを計算します。互いに置き換えはききません。
| アルゴリズム | 出力 | 衝突耐性 | 見かける場面 |
|---|---|---|---|
| CRC32 | 32 ビット | なし(誤り検出用) | SFV ファイル、ZIP の各エントリーの CRC-32 欄(APPNOTE) |
| MD5 | 128 ビット | 破られている(2004) | 古い配布ページ |
| SHA-1 | 160 ビット | 破られている(2017、SHAttered) | 古い配布ページ、Git のオブジェクト ID |
| SHA-256 | 256 ビット | 強い | Node.js の SHASUMS256.txt、Ubuntu の SHA256SUMS |
| SHA-384 | 384 ビット | 強い | W3C SRI 仕様の例 |
| SHA-512 | 512 ビット | 強い | Firefox の SHA512SUMS、npm の integrity |
MD5 と SHA-1 が「破られている」とは、ハッシュ値が同じ別々のファイルを攻撃者が作れるという意味です。MD5 が一致すれば偶発的な破損がないことはわかりますが、誰も意図的に書き換えていないことまではわかりません。ツールが MD5 と SHA-1 に「旧式」と表示するのはそのためです。
方針を決めるなら SHA-256 にしてください。配布元が MD5 しか出していなければそれを照合し、転送の確認として扱ったうえで SHA-256 の掲載を頼みましょう。
ブラウザはどうハッシュを計算しているのか
ブラウザー標準の crypto.subtle.digest() は、データ全体を 1 つのバッファーで受け取ります。少しずつ渡す方法はありません。このツールの旧版はその通りに File.arrayBuffer() でファイル全体をメモリに読み込んでいたため、1 GB でタブのメモリが約 2 GB 増え、3 GB では失敗していました。
現在はストリームで計算します。チェックしたアルゴリズムごとに Web Worker を 1 つ使い、file.stream() で 1 MB ずつ読み、途中の状態を保てる hash-wasm に渡します。メモリはワーカーごとに 1 ブロック分程度です。2026 年 10 月 1 日、Apple M1 Max のデスクトップ版 Chromium で、1 GB の SHA-256 は 4.3 秒、メモリの増加は約 100 MB でした。4,080,486,400 バイトの Ubuntu 24.04.5 サーバー版 ISO も公式の値と一致しました。
アップロードも保存もしません。通信は計算用スクリプトを読み込む 1 回だけです。同じ考え方を短く書くと次のようになります。
import { createSHA256 } from 'hash-wasm';
async function sha256(file) {
const hasher = await createSHA256();
hasher.init();
const reader = file.stream().getReader();
for (;;) {
const { done, value } = await reader.read();
if (done) break;
hasher.update(value);
}
return hasher.digest('hex');
}
new Blob(['abc']) を渡すと、FIPS 180-2 のテスト値 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad が返ります。
コマンドで同じ結果を得るには次のようにします。
# Linux(GNU coreutils)
sha256sum ubuntu-24.04.5-wsl-amd64.wsl
# macOS
shasum -a 256 ubuntu-24.04.5-wsl-amd64.wsl
# Windows
certutil -hashfile ubuntu-24.04.5-wsl-amd64.wsl SHA256
Get-FileHash ubuntu-24.04.5-wsl-amd64.wsl
出力の形はそれぞれ違います。sha256sum と shasum はハッシュ値とファイル名、certutil は説明の行・ハッシュの行・完了メッセージ、Get-FileHash は大文字の16進数の表です。ツールの照合欄はこれらに加え、SHA256SUMS 全体、SHA256 (ファイル) = … 形式のタグ行、Base64 / SRI も読み取り、値全体で比較します。
実例:JAIST ミラーの Ubuntu WSL イメージを照合する
2026 年 10 月 1 日に確認したところ、JAIST ミラーの ubuntu-releases/24.04/SHA256SUMS は releases.ubuntu.com の SHA256SUMS とバイト単位で同じで、9 行ありました。8 行目は次の通りです。
bb415d824822c4b878125729af451a5d18fb13d1cf5cbed9a7393ad64ac6039e *ubuntu-24.04.5-wsl-amd64.wsl
ubuntu-24.04.5-wsl-amd64.wsl(388,975,696 バイト)をツールにドロップし、9 行を照合欄に貼り付けると、SHA-256 の計算が自動で始まり、カードに「一覧の ubuntu-24.04.5-wsl-amd64.wsl の SHA-256 と一致します(8 行目)。」と出ます。ほかの 8 行は選んでいないファイルとして数えられ、sha256sum -c --ignore-missing と同じ扱いです。
値が合わず「不一致」と表示されたら、次の順に確かめます。
- 64 桁を全部、正しい行からコピーしたか。1 文字欠けたり増えたりした場合は、不一致ではなく桁数や文字の誤りとして表示されます。
- できれば別のミラーからダウンロードし直す。転送中の破損がいちばん多い原因です。
- チェックサム一覧に署名があれば、一覧の値を信じる前に署名を検証する。Ubuntu は
SHA256SUMS.gpgと検証手順を公開しています。一覧が改ざんされていれば、ハッシュ値の一致には意味がありません。
ツールはハッシュの計算までです。署名の検証には配布元の OpenPGP 公開鍵が必要なので、手元の gpg --verify で行ってください。
ツールが解決しないエッジケース
- 巨大なファイルは時間がかかる。 サイズの上限はありませんが、時間はサイズに比例し、終わるまでタブを開いておく必要があります。
- フォルダーには 1 つのハッシュ値がない。 フォルダーをドロップすると、中のファイルを 1 つずつ(最大 1,000 件)計算し、相対パスを保って
SHA256SUMSとファイル名で照合します。フォルダー全体の指紋が必要なら、.tar.gzや.zipにまとめてから計算してください。 - ダウンロードしながらの計算。 ツールが読むのはディスク上にあるファイルです。受信しながら計算するのはコマンドラインの仕事(
curl … | sha256sum)です。 - ほかのアルゴリズムと用途。 SHA-224・SHA3・BLAKE2・BLAKE3 は計算せず、非対応と表示します。鍵付きの完全性確認は HMAC ジェネレーター、パスワードの保存は Bcrypt ハッシュ生成・検証、ファイルではなく文字列のハッシュはハッシュジェネレーターを使ってください。
ブラウザーのツールが便利な場面
ターミナルに慣れた開発者なら sha256sum を使います。ただ、ダウンロードはそれ以外の場面でも起きます。Windows の PC、管理された業務端末、同僚の手伝いなどです。ブラウザーのツールはそうした場面に向いています。
- macOS・Windows・Linux・ChromeOS で同じページを使える。
- インストールも管理者権限もいらない。
- ディスク上のファイルをそのまま扱い、ファイルやフォルダーをドロップできる。
- 値 1 つでも一覧全体でも貼り付ければファイル名で照合でき、64 文字を目で比べなくて済む。
署名の検証や、CI での完全性チェックの代わりにはなりません。
さらに読む
- ファイルハッシュ値確認ツール:ツール本体。例と、他のブラウザー上のツールとの比較があります。
- GNU coreutils:cksum の出力形式:
sha256sumの行の形式、*のバイナリー印、ファイル名のエスケープ。 - MDN:SubtleCrypto.digest:ブラウザーの一括計算 API。
- SHAttered:2017 年の SHA-1 衝突。