ハッシュ関数を解説:ファイルの完全性を簡単に検証
ハッシュ関数は転送後のファイル完全性検証に不可欠。SHA-256やMD5がファイルの無変更を保証する仕組みを解説。
ハッシュ関数は任意の入力を受け取り、固定サイズの出力を生成します。SHA-256 は入力がツイートであれ10 GB の動画であれ、常にちょうど256ビット(32バイト)を出力します。入力の1ビットを変えると、出力ビットのほぼ半数が変わります。この一方向性と決定論的な性質が、ハッシュをファイル整合性検証のデフォルトツールにしています。送信前に SHA-256(ファイル) を計算し、受信後に再度計算して一致すれば、ファイルは無傷で到達したことになります。Linux ディストリビューションが ISO ダウンロードを検証し、Git がコミットを識別し、HexaTransfer のようなサービスがマルチギガバイトのアップロードの完全性を確認するのはこの仕組みです。
ハッシュ関数が保証すること
暗号ハッシュ関数を定義する3つの性質があります。
- 決定論的:同じ入力は常に同じ出力を生成します。
SHA-256("hello")は常に2cf24dba5fb0a30e...です。 - 原像計算困難性:ハッシュ値から、そのハッシュを生成する入力を効率的に見つけることができません。
- 衝突困難性:同じハッシュを生成する異なる2つの入力を効率的に見つけることができません。
さらに2つの有用な特性があります。
- 雪崩効果:入力の1ビットを変えると出力ビットの約50%が反転します。検索には使えませんが、フィンガープリンティングに最適です。
- 固定出力サイズ:SHA-256 は32バイト、SHA-512 は64バイト、BLAKE2b は64バイトで、入力サイズにかかわらず一定です。
ハッシュは暗号化ではありません。一方向性があり、出力から入力を復元できません。それがハッシュの目的です。
SHA ファミリーの変遷
NIST が FIPS 180-4 と FIPS 202 で標準化した Secure Hash Algorithm ファミリーは以下のとおりです。
- SHA-1:160ビット、2017年に Google の SHAttered 攻撃で解読されました。セキュリティ用途では使用しないでください。
- SHA-2(SHA-224・SHA-256・SHA-384・SHA-512):現代システムの主力。SHA-256 が最も普及しています。
- SHA-3(Keccak):異なる構造(スポンジ、Merkle-Damgård ではない)で2015年に標準化。SHA-2 の弱点が顕在化した場合の代替として設計。
SHA-256 は TLS 証明書の署名・Bitcoin のマイニング・Git でのファイル識別・ファイル転送サービスの整合性確認に使われています。SHA 拡張機能を持つ現代の CPU でのスループットはコアあたり2〜4 GB/s です。
MD5 と SHA-1 がセキュリティ用途で終わった理由
MD5(1991年)は128ビットのハッシュを生成し、2004年に衝突が実証されるまで標準でした。2012年には Flame マルウェアが MD5 衝突攻撃を使用して Microsoft のコード署名証明書を偽造しました。現在はラップトップで数秒以内に MD5 衝突を生成できます。
SHA-1 は長持ちしましたが、2017年に Google の SHAttered 攻撃で陥落しました。110 GPU-年の計算で同一の SHA-1 ハッシュを持つ2つの PDF を生成することに成功し、現在はクラウド GPU で10万ドル以下で再現可能です。
どちらも非セキュリティ用途には問題ありません。偶発的な破損の検出・ストレージの重複排除・キャッシュキーのフィンガープリンティングには使えます。デジタル署名・パスワード検証・攻撃者が一致を偽造することで利益を得られるものには使用できません。
BLAKE2 と BLAKE3:速度とセキュリティの両立
BLAKE2(2012年)と BLAKE3(2020年)は SHA-3 レベルのセキュリティを SHA-256 の2〜10倍の速度で提供します。BLAKE3 はシングルスレッドで約6 GB/s を達成し、コア数に比例してスケールします。16コアのマシンで100+ GB/s も可能です。
採用は広がっています。WireGuard は認証に BLAKE2s を使用し、Zcash は BLAKE2b を採用、b3sum は開発ツールで sha256sum の代替として普及しつつあります。マルチギガバイトのアップロードを処理するファイル転送サービスは、ハッシュ計算がボトルネックにならないよう BLAKE3 を増やしています。
ブラウザはまだ Web Crypto API で BLAKE3 を公開していないため、JavaScript 実装は WASM コンパイルされたリファレンスコードに依存しており、ブラウザ内で約500 MB/s です。
ファイル転送ワークフローでのハッシュの役割
ハッシュが活躍する場面がいくつかあります。
- アップロード後の整合性確認:クライアントがアップロード中に SHA-256 を計算し、サーバーが到着時に計算して不一致があれば再アップロードを促します。S3 は速度を優先して MD5 を使用しますが、受動的な破損への衝突耐性は不要です。
- チャンクアップロードの検証:大きなファイルは4 MB または5 MB のチャンクに分割され、各チャンクにハッシュが付与され、ハッシュのツリー(Merkle ツリー)がファイル全体の単一のルートハッシュを生成します。
- 重複排除:2人のユーザーが同じファイルをアップロードすると、ハッシュが一致してストレージは1回だけ保存します。Dropbox のブロックレベル重複排除と CDN キャッシュで使用されています。
- ダウンロード検証:一部のサービスはダウンロードページに SHA-256 を表示し、受信者が確認できます。
- バージョン識別:Git はコミット ID に SHA-1 を使用(SHA-256 への移行中)し、ファイルの内容がその識別子を決定します。
HMAC による認証拡張
普通のハッシュは整合性を確認できますが、真正性は確認できません。誰でも SHA-256(ファイル) を計算できます。秘密鍵を追加すると、ハッシュはメッセージ認証コード(MAC)になります。鍵を持つ人だけが MAC を生成・検証できます。
HMAC(RFC 2104)は標準的な構成です:HMAC(key, msg) = SHA-256(key' ⊕ opad || SHA-256(key' ⊕ ipad || msg))。TLS 1.2・HS256 で署名された JWT・AWS リクエスト署名・多くのセッションクッキースキームで使用されています。
ファイル転送では HMAC は AES-GCM の認証タグ(HMAC ではなく GHASH を使いますが同じ役割)や一部サービスの API リクエスト署名に現れます。
Merkle ツリー:大規模なハッシュ処理
非常に大きなファイルやファイルコレクションに対して、毎回全体をハッシュするのは非効率です。Merkle ツリーはハッシュを二分木に配置します。葉はチャンクのハッシュ、内部ノードは子のハッシュ、ルートハッシュはデータセット全体を表します。
利点は以下のとおりです。
- 効率的な更新:1つのチャンクを変更すると log(n) ノードの再ハッシュだけが必要です。
- 包含証明:特定のチャンクがルートに属することを、log(n) の兄弟ハッシュだけで証明できます。
- 並列計算:ブランチが独立してハッシュできます。
BitTorrent(v2以降)・IPFS コンテンツアドレッシング・Git のツリーオブジェクト・証明書透明性ログ・ブロックチェーンのトランザクションルートで使用されています。ファイル転送サービスは、部分的なアップロードを元のものと照合する必要がある再開可能なアップロードに Merkle ツリーを使用します。
パスワードとハッシュ
ハッシュのもう一つの用途は、パスワードを安全に保存できる値に変換することです。単純な SHA-256(パスワード) は不十分です。GPU ファームは1秒あたり数十億の SHA-256 を計算できるため、一般的なパスワードは瞬時に解読されます。
パスワード専用のハッシュは計算コストを追加します。
- PBKDF2-HMAC-SHA-256(60万回のイテレーション、OWASP 2023推奨)。
- bcrypt(コスト係数12、約250 ms/ハッシュ)。
- scrypt(メモリハードネスで GPU への耐性)。
- Argon2id:現在のベストプラクティス、メモリハードで並列耐性。
目的はハッシュ自体によるセキュリティではなく、各推測を十分高価にして弱いパスワード以外へのオフラインブルートフォースを非現実的にすることです。
コマンドラインでのダウンロード検証
重要なファイルはコマンドラインツールで検証できます。macOS または Linux では次のとおりです。
shasum -a 256 ubuntu-24.04.iso
Windows PowerShell では次のとおりです。
Get-FileHash ubuntu-24.04.iso -Algorithm SHA256
出力を ubuntu.com に掲載されたハッシュと比較します。一致すればファイルは無傷でダウンロードされ、Canonical が署名したものと同じです。異なる場合は、ダウンロードが破損したかファイルが差し替えられています。
最大限の信頼を得るには、GPG と Canonical の署名鍵を使ってハッシュファイル自体の署名を検証します。署名済みハッシュファイル→ファイルハッシュ→ファイルという多段階のチェーンが、Linux ディストリビューションが数十年にわたって信頼を維持してきた仕組みです。
ファイル転送サービスの整合性対応を確認する方法
任意のファイル転送プロバイダーに聞く価値のある4つの質問です。
- アップロード検証にどのハッシュアルゴリズムを使用しているか(SHA-256 または BLAKE3 が適切、MD5 は破損検出のみなら許容、無回答は要注意)。
- ハッシュを受信者に表示するか(必須ではないが親切)。
- チャンクアップロードで Merkle ツリー検証を行うか。
- エンドポイント間でハッシュを比較する方法があるか。
SwissTransfer・Tresorit・Proton Drive・HexaTransfer はすべて転送中に SHA-256 を計算して到着時に検証します。整合性エラーが発生すると、転送全体を失敗させるのではなく、影響を受けたチャンクの自動再アップロードが行われます。
hexatransfer.comでお試しください — 無料、登録不要、最大10GB。
エンドツーエンド暗号化で大容量ファイルを安全に送信
エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。
ファイルを送信