ファイルハッシュ検証ツール
ファイルのMD5、SHA-1、SHA-256、SHA-384、SHA-512ハッシュ値を計算
ここにファイルをドラッグ&ドロップ
任意のファイルタイプとサイズに対応
ファイルハッシュとは?
ファイルハッシュは、ファイル内容を特定のアルゴリズムで固定長ダイジェストにマッピングするプロセスです。同じファイルは常に同じハッシュ値を生成し、ファイル内容のわずかな変化でも完全に異なる結果になります。ハッシュ値からファイル内容を逆算することは不可能です。本ツールはMD5、SHA-1、SHA-256、SHA-384、SHA-512の複数アルゴリズムに対応し、さまざまなシーンの検証ニーズを満たします。
使い方
使い方
- ファイルをアップロードエリアにドラッグするか、「ファイルを選択」ボタンをクリック
- 計算したいハッシュアルゴリズムにチェックを入れてください(複数選択可)
- 「ハッシュを計算」ボタンをクリックして開始します
- 計算後、個々のハッシュ値をコピーするか、すべてまとめてコピーできます
- 検証するには、既知のハッシュ値を比較フィールドに入力してください
検証の手順
- ファイルのダウンロードまたはコピーが完全に完了してからハッシュを計算してください。不完全なファイルや転送中断では異なる値が生成されます。
- 公開されたチェックサムと比較する際は、公式ソースからコピーし、アルゴリズムを正確に一致させてください。
利用シーン
仕組み
ページ上のすべての SHA ダイジェストは W3C Web Cryptography API(ブラウザでは crypto.subtle として公開)で計算されます。呼び出しは await crypto.subtle.digest(algorithm, buffer) で、algorithm は 'SHA-1'、'SHA-256'、'SHA-384'、'SHA-512' のいずれか(大文字小文字を区別)、buffer は ArrayBuffer か任意の TypedArray です。関数は Promise を返し、解決するとダイジェストのバイト列を含む ArrayBuffer になります。これを new Uint8Array で走査し、各バイトを byte.toString(16).padStart(2, '0') にマッピングして小文字 16 進数に変換します。SubtleCrypto は安全なコンテキスト(HTTPS または localhost)でのみ利用でき、SHA-1 はレガシー検証のために残されているものの、仕様では衝突耐性は破られていると明記されています。 MD5 は Web Crypto 仕様に含まれず(W3C が衝突攻撃を理由に意図的に省略)、本ページの MD5 はブラウザ内で完結する純粋 JavaScript 実装で計算します。MD5 でも SHA 系列でも、本ツールはファイルを FileReader.readAsArrayBuffer で一度に ArrayBuffer として読み込み、JavaScript の MD5 ルーチンか crypto.subtle.digest に渡すだけです。本ツールには .append 形式のインクリメンタル API も Web Worker のフォールバックもないため、メモリにファイル全体が収まる必要があります。一般的なダウンロードなら問題ありませんが、数 GB の負荷ではディスクからストリーミング処理するデスクトップツール(sha256sum、certutil -hashfile、Get-FileHash)の方が適しています。 ダイジェスト長とセキュリティ:MD5 = 128 ビット / 32 桁の 16 進数(RFC 1321、王小雲が 2004 年に衝突耐性を破り、2012 年に Flame マルウェアが実戦投入);SHA-1 = 160 ビット / 40 桁の 16 進数(FIPS 180-4、Google の SHAttered が 2017 年に約 9.2 × 10^18 回の SHA-1 計算で衝突を実証、NIST は 2030 年以降に正式廃止予定);SHA-256 = 256 ビット / 64 桁の 16 進数(FIPS 180-4、既知の衝突なし、推奨される基準);SHA-384 と SHA-512 = 384 / 512 ビットで、SHA-512 系列の切り詰めと完全出力(FIPS 180-4)。暗号学的ハッシュの雪崩効果により、入力 1 ビットの反転は出力ビットの約半数を平均で変化させるため、1 バイト変更しただけで全く別のダイジェストになります。
- crypto.subtle.digest(algorithm、buffer)は'SHA-1'、'SHA-256'、'SHA-384'、'SHA-512'(大文字小文字区別)を受け付け、'MD5'は拒否する。セキュアコンテキスト(HTTPSまたはlocalhost)が必要で、Promise<ArrayBuffer>を返す。
- 16進エンコーディング:結果をnew Uint8Array(digestBuffer)として走査し、各バイトをbyte.toString(16).padStart(2, '0')にマッピング。ダイジェストの比較は大文字小文字を区別しない(.toLowerCase()で正規化)。
- MD5 は Web Crypto に意図的に含まれていません。本ツールは純粋 JavaScript で MD5 を計算し、FileReader.readAsArrayBuffer でファイルを 1 つの ArrayBuffer として一度に読み、32 桁の小文字 16 進数ダイジェストを一回で生成します。
- メモリ特性:ページは .append 形式のインクリメンタル API も Web Worker への退避も使わず、ファイル全体を単一の ArrayBuffer として読み込み、そのバッファを 1 回の呼び出しで JavaScript MD5 か crypto.subtle.digest に渡します。タブの利用可能ヒープを超えるファイルでは、ディスクからストリーミング処理するデスクトップツール(sha256sum、certutil -hashfile、Get-FileHash)を使ってください。
- ダイジェストサイズ(FIPS 180-4):MD5が128ビット、SHA-1が160ビット、SHA-256が256ビット、SHA-384が384ビット、SHA-512が512ビット。16進文字数はバイト数の2倍。
- 既知の衝突攻撃:MD5は王氏(2004年)により破られ、Flame(2012年)が悪用。SHA-1はGoogle SHAttered(2017年、約9.2×10^18回の演算、約110GPU年)で破られた。SHA-256以上には既知の実用的な衝突はない。
- 雪崩効果:入力の1ビット変化で出力ビットの約50%が反転。これが1バイトの編集で完全に異なる16進ダイジェストが生成される理由であり、部分ファイルの一致が存在しない理由。
使用例
公開チェックサムでダウンロードファイルを検証
ファイル: sample.bin (3 バイト、内容: abc)
SHA-256 (計算値):
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
配布元の SHA256SUMS の行:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad sample.bin
一致 -> ダウンロードは破損・改竄されていない
(両方の値は 3 バイトの入力 'abc' に対する FIPS 180-2 SHA-256
リファレンスベクトル。実運用では入力を実際のファイルに置き換える。
アルゴリズムの出力は決定的。)同一入力に対する複数アルゴリズムの比較
ファイル: sample.txt (3 バイト、内容: abc)
MD5: 900150983cd24fb0d6963f7d28e17f72
SHA-1: a9993e364706816aba3e25717850c26c9cd0d89d
SHA-256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA-512: ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
入力は同じでもアルゴリズムが異なれば出力も異なる -> セキュリティ用途には SHA-256 以上を使用
(MD5 は RFC 1321 のリファレンスベクトル、その他は FIPS 180-2 の
リファレンスベクトル。すべて 3 バイトの入力 'abc' に対する値。)1 バイトの変更を検出 (アバランシェ効果)
入力 A: abc (3 バイト)
入力 B: abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq (56 バイト)
A の SHA-256: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
B の SHA-256: 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
入力にわずかな変更を加えるだけで、ダイジェストは完全に異なるものになる
-> これがアバランシェ効果。
(両方の値は FIPS 180-2 SHA-256 のリファレンスベクトル。)ブラウザコンソールでの照合用リファレンス
// Node.js で再現して比較
$ printf 'abc' | shasum -a 256
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
// Windows の PowerShell
PS> 'abc' | Get-FileHash -Algorithm SHA256 | Select-Object -ExpandProperty Hash
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
// ブラウザコンソールで Web Crypto API を使用:
// const buf = new TextEncoder().encode('abc');
// const hash = await crypto.subtle.digest('SHA-256', buf);
// -> 'abc' の SHA-256 を表す ArrayBuffer (FIPS 180-2 リファレンスベクトル)
ファイルはブラウザ内に留まり、アップロードはされません。よくある質問
どのハッシュアルゴリズムが生成できますか?
一般的な選択肢は MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 です。ページはブラウザの Web Crypto API(SHA ファミリー)と組み込み JS(MD5)を使用して計算します。SHA-256 は現在の汎用的な推奨選択肢です。
ファイルはどこかにアップロードされますか?
いいえ。ハッシュ計算は File API と Web Crypto を使用してブラウザ内で完結します。バイトはチャンクに分けてメモリに読み込まれ、ハッシュはローカルで計算されます。ファイルがネットワークを越えることはありません。ハッシュ計算中にネットワークタブで確認できます。
MD5 は破られているのに、なぜまだ提供されているのですか?
MD5 はセキュリティ用途では破られています(衝突を簡単に作成可能)が、ダウンロードがソースとビット単位で同一であることを検証するための事実上のチェックサムとしては依然として使われています。多くのベンダーは今でも SHA-256 と並んで MD5 を公開しています。MD5 はその用途のみに使い、パスワードハッシュや署名には決して使わないでください。
同じように見えるファイルなのに SHA-256 ハッシュが異なるのはなぜですか?
ハッシュ入力にはすべてのバイトが含まれるため、末尾の改行 1 つ、BOM、改行コードの違い(CRLF と LF)でもハッシュは完全に変わります。コピー&ペーストではなく、元のファイルを再ダウンロードするか、バイナリビューアで両方のファイルのバイトが完全に一致しているか確認してください。
ファイルサイズに制限はありますか?
ブラウザがファイルを読み込むのに十分なメモリを保持できる必要があります。最近のデスクトップでは数 GB のファイルも処理できますが、モバイルブラウザでは数百 MB 前後でメモリ不足になる場合があります。非常に大きなファイルにはデスクトップツール(sha256sum、certutil、Get-FileHash)を使用してください。ディスクからストリーミング処理し、より高速です。
異なる 2 つのファイルが同じハッシュを生成することはありますか?
理論的には起こり得ます(鳩の巣原理)が、SHA-256 ではその確率は天文学的に低いです。MD5 と SHA-1 には既知の衝突攻撃があるため、同じ MD5 や SHA-1 を持つ 2 つのファイルが同一ファイルであるとは限りません。SHA-256 の衝突は既知の攻撃では実行不可能です。
ウェブサイトに公開されているハッシュと自分のハッシュが異なるのはなぜですか?
多くの場合、ローカライズ・署名・再パッケージされたバージョンをダウンロードしている、ページが別バージョンのハッシュを掲載している、またはダウンロードが切れた、のいずれかです。新しいツールで再ダウンロードしてから再ハッシュしてください。それでも一致しない場合は、そのファイルを信頼すべきではありません。