ハッシュでファイルの整合性を検証する方法
ソフトウェア、ファームウェア、重要な文書をダウンロードするとき、ファイルが発行者が意図したとおりであるとどうやって知るでしょうか。ファイルハッシュは暗号フィンガープリント、つまりファイルの1バイトでも異なれば変わる一意の文字列を提供します。ハッシュの検証には数秒しかかかりませんが、改ざんされたソフトウェアのインストール、デバイスを壊す壊れたファームウェアの書き込み、実際に復元が必要なときに失敗する破損したバックアップを信頼することからあなたを救えます。
ハッシュ関数の簡単な歴史
チェックサムの考えはコンピューティング自体より古いです。会計士は、検証するファイルが存在する前から、転記エラーを検出するために算術的な桁の合計を使っていました。暗号ハッシュは1980年代後半に登場しました。Ron Rivestは1990年にMD4、1991年にMD5を発表し、20年間事実上のチェックサムになりました。NISTは1993年にSHA-0を標準化しましたが、欠陥が発見された後、1995年に素早くSHA-1に置き換えました。SHA-2ファミリー(SHA-224、SHA-256、SHA-384、SHA-512)は2001年に、迫り来るSHA-1の弱点に対処するために続きました。
各世代は、予想より安価であることが判明した攻撃によって引退しました。MD5の衝突は2004年に実証され、2008年にデジタル証明書に対して実用的になり、現在は自明です。SHA-1は2017年のGoogleのSHAtteredアタックに屈しました。研究者が同一のSHA-1ダイジェストを持つ2つの異なるPDFを生成したのです。SHA-2は2001年以来持ちこたえており、SHA-3(Keccak、2015年に標準化)はSHA-2が破れた場合の、構造的に異なるフォールバックを提供します。教訓は、ハッシュアルゴリズムには賞味期限があるということです。今日の正しいアルゴリズムは10年以内に置き換えが必要かもしれません。
ファイルハッシュの仕組み
ハッシュ関数はファイルのすべてのバイトを読み、固定長の文字列を生成します。同じファイルは常に同じハッシュを生成します。1バイト変えると、ハッシュは完全に変わります。これはアバランチ効果と呼ばれ、ハッシュを検証に有用にする特性です。
例:
- 元のファイル(SHA-256):
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 同じファイル、1バイト変更:
d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
2つのハッシュは、ファイルが1ビット異なるだけでも、認識可能なパターンを共有しません。その感度が検証を可能にします。ハッシュを生成し、公開されたハッシュと比較すると、ファイルが本物かどうかが瞬時に分かります。
内部的に、モダンなハッシュ関数はファイルを固定サイズのブロック(SHA-256で64バイト、SHA-512で128)に分割し、各ブロックを圧縮関数に通し、状態を前方に連鎖させます。出力は、最後のブロックが混ぜ込まれた後の最終状態です。連鎖がすべてのバイトに依存するため、攻撃者がハッシュ全体を書き換えずに内容を変えられるショートカットはありません。
ファイルを検証する手順
- 公式ハッシュを見つける: ソフトウェア発行者は通常、ダウンロードページにファイルハッシュをリストし、しばしば「SHA-256チェックサム」または「SHA256SUMSファイル」とラベル付けされます。
- ダウンロードしたファイルをアップロード: ハッシュ計算機でファイルを選択します。ハッシュはブラウザ内でローカルに計算され、ファイルはマシンを離れません。
- ハッシュを比較: 計算したハッシュが公式ハッシュと正確に一致すれば、ファイルは本物で破損していません。文字列が長い場合は、両方をテキスト差分にコピペします。
- アルゴリズムを一致させる: SHA-256のハッシュは他のSHA-256のハッシュのみと一致します。発行者がSHA-512を提供する場合、SHA-512も生成します。アルゴリズムの混在は最も一般的な「一致しない」ミスです。
- 可能なら公開ハッシュ自体も検証: 署名されたSHA256SUMSファイル(発行者のGPG鍵で署名された)は、ハッシュリストが改ざんされていないことを教えてくれます。ダウンロードページの素のハッシュはそうではありません。
ファイルハッシュを検証する場面
- ソフトウェアダウンロード: インストーラーとアップデートがダウンロード中に改ざんまたは破損していないことを検証します。バイナリを提供する誰も(ISP、CDN、ミラー)が理論的に敵対的なものに置き換える可能性があります。
- ファームウェアアップデート: 破損したファームウェアファイルはデバイスを壊す可能性があります。ルーター、IoTデバイス、マザーボードBIOSを書き込む前に必ず検証してください。復旧はしばしば特別なハードウェアを必要とします。
- ISOイメージ: オペレーティングシステムイメージはUSBに書き込んだりインストールしたりする前に検証すべきです。Linuxディストリビューションは普遍的にSHA-256ハッシュとそれらのハッシュに対するGPG署名の両方を公開します。両方を検証してください。
- 法的および財務文書: 契約、監査レポート、財務諸表が署名または共有後に変更されていないことを検証します。ハッシュは改ざん明らかな受領証を提供します。
- バックアップの検証: バックアップファイルが元と同一であることを確認します。サイレントなディスク破損は実在し、作成以来ハッシュがドリフトしたバックアップはきれいに復元できないかもしれません。
- CI/CDアーティファクト: デプロイメントパイプラインでビルドアーティファクトをSHA-256で固定すると、テストしたバイナリがデプロイするバイナリであることが保証されます。コンテナイメージは、コンテンツアドレス可能なダイジェストで設計上これを行います。
- ソフトウェアサプライチェーン監査: セキュリティアドバイザリが「このバージョンはハッシュXを持つ」と言うとき、サーバー上に何があるかを確認する唯一の方法は、そこのファイルをハッシュして比較することです。それなしでは、攻撃者がコントロールするバージョン文字列を信頼することになります。
サポートされるアルゴリズム
| アルゴリズム | ハッシュ長 | 出力ビット | 推奨 |
|---|---|---|---|
| MD5 | 32 hex文字 | 128 | レガシーのみ、破られている、偶発的破損のみ |
| SHA-1 | 40 hex文字 | 160 | レガシーのみ、破られている、セキュリティに信頼しない |
| SHA-224 | 56 hex文字 | 224 | ニッチ。SHA-256を好む |
| SHA-256 | 64 hex文字 | 256 | 推奨される汎用標準 |
| SHA-384 | 96 hex文字 | 384 | 高セキュリティ、TLS 1.3暗号スイートで使用 |
| SHA-512 | 128 hex文字 | 512 | SHA-2の最大強度、64ビットCPUで高速 |
| SHA3-256 | 64 hex文字 | 256 | SHA-2と異なる内部設計、将来対応 |
| BLAKE2b / BLAKE3 | 変動 | 256または512 | 最速のモダンハッシュ、rsync、resticで使用 |
| CRC32 | 8 hex文字 | 32 | エラー検出のみ、セキュリティハッシュではない |
選択肢があれば、SHA-256が正しいデフォルトです。64ビットマシンではわずかに良いパフォーマンスのためにSHA-512を使ってください(アルゴリズムは64ビットワード用に調整されています)。スループットが最も重要なときはBLAKE3に手を伸ばしてください。SHA-256ができない方法でモダンなNVMe SSDを飽和させられます。
ハッシュとデジタル署名
ハッシュはファイルが変わったかどうかを教えます。デジタル署名はそれが変わったかどうかと、誰がハッシュを作成したかを教えます。署名は発行者の秘密鍵で暗号化されたハッシュです。彼らの公開鍵で復号し、ハッシュを再計算し、両者が一致することをチェックします。一致すれば、ファイルが無傷であることと、発行者(または彼らの秘密鍵を持つ誰か)がそれを承認したことが分かります。
ダウンロードページがSHA-256ハッシュと.sigまたは.ascファイルの両方を表示するとき、ハッシュは破損と偶発的な改ざんから保護しますが、ダウンロードサーバーに侵入した攻撃者から保護するのは署名です。攻撃者はファイルを置き換えて表示されたハッシュを更新できますが、発行者の鍵なしには有効な署名を偽造できません。
よくある落とし穴
- 間違ったアルゴリズムを比較: MD5とSHA-256は異なる長さの文字列を生成します。不一致のアルゴリズムは、同一ファイル上でも決して一致しません。
- ファイルと同じ場所から提供されたハッシュを信頼: 両方が同じ侵害されたミラー上にある場合、両方が置き換えられる可能性があります。可能な限り、ハッシュを異なるドメインから取得してください(プロジェクトのGitHubリリースページ、署名されたSHA256SUMSファイル)。
- Hexの大文字小文字: ハッシュは大文字小文字を区別しません(
a3fとA3Fは同じバイトを表す)。文字列比較はまだ異なるとフラグを立てるかもしれません。両側を小文字にするか、バイトとして比較してください。 - 末尾の空白とBOM: 末尾の改行や見えない文字を持つコピーされたハッシュは、同じに見えますが一致しません。比較前に両側をトリムしてください。
- 間違ったファイルをハッシュ: Windowsでは、2回ダウンロードした場合、ダウンロードパスが
Downloads\file.exeではなくDownloads\file (1).exeになるかもしれません。ハッシュする前にパスを検証してください。 - MD5やSHA-1をセキュリティ保証として扱う: 攻撃者は、悪意のあるファイルと同じMD5を持つ無害に見えるファイルを数秒で作成できます。セキュリティには、つねにSHA-256以上を使ってください。
- 間違ったものを検証: 発行者が圧縮された
.tar.gzをハッシュし、あなたが抽出された内容をハッシュすると、どちらも一致しません。ハッシュされたものをハッシュしてください。通常はダウンロードされたアーカイブ自体です。 - GPG署名を無視: 多くの人はハッシュを検証しますが、署名はスキップします。署名はミラーをコントロールする攻撃者から防御するものです。
- ネットワーク破損のサイレント失敗: 切り詰められたダウンロードは、両方が同じように切り詰められた場合、部分ファイルハッシュと一致する可能性があります。チャンクではなく、使用するつもりの完全なファイルをハッシュしてください。
- 古いダウンロードのブラウザキャッシュ: 古いキャッシュされたファイルが検証ステップを欺くことがあります。ハッシュが不一致でキャッシュを疑う場合、新しいダウンロードを強制してください。
代替ツールと文脈
Webハッシュ計算機は1つのファイルをチェックするときの最速の経路です。繰り返し使用やスクリプトには、コマンドラインツールが標準です。
| ツール | プラットフォーム | 強み | 注意点 |
|---|---|---|---|
| Webハッシュ計算機 | ブラウザ | インストール不要、ファイルがアップロードされない | 一度に1ファイル |
sha256sum | Linux | 高速、スクリプト可能、GNU coreutils | --checkはSHA256SUMSファイルを読む |
shasum -a 256 | macOS、BSD | バンドル、同じ出力形式 | Linuxとはバイナリ名が異なる |
Get-FileHash | Windows PowerShell | Windowsでファーストクラス | 出力形式がsha256sumと異なる |
certutil -hashfile | Windows cmd | すべてのWindowsで利用可能 | 冗長な出力は解析が必要 |
openssl dgst -sha256 | クロスプラットフォーム | OpenSSLをすでに持っているなら | 専用ツールより遅い |
b3sum | クロスプラットフォーム | BLAKE3、マルチGB/sスループット | 新しい、あまり普及していない |
rhash | クロスプラットフォーム | 多くのアルゴリズムを一度に計算 | 追加のインストール |
CI/CDパイプラインでは、同じタスクは通常、ビルド中にsha256sum file > file.sha256として、検証中にsha256sum -c file.sha256として実行され、しばしば署名されたマニフェストにラップされます。原則(計算、公開、取得時に比較)は、ブラウザツールが対話的に行うものと同じです。
プライバシーとハッシュ計算機
ハッシュ計算機は完全にブラウザ内で動作します。選択したファイルはFileReader APIで読まれ、Web Crypto SubtleCryptoインターフェースを通され、結果のハッシュが表示されます。ファイルのバイトはサーバーに移動しません。アップロードなし、どのファイルがハッシュされたかのログなし、ファイルサイズや拡張子の分析なしです。機密素材(契約、医療記録、秘密鍵)には、アップロードするツールとローカルでハッシュするツールの違いは、1つの第三者を信頼することと誰も信頼しないことの違いです。ハッシュは小さな出力です(SHA-256で64 hex文字)が、それが要約する入力は非常に明らかになり得ます。その入力をクライアントサイドに保つことは、任意の検証タスクに対する正しいデフォルトです。
よくある質問
ファイルのハッシュを公式のものとどう比較しますか?
ハッシュを生成したあと、配布元(通常はダウンロードページ)が公開しているハッシュと文字単位で比較します。すべての文字が一致すれば、ファイルは本物で破損していません。1 文字でも違えば、ファイルは変更されています。
どのハッシュアルゴリズムを使うべきですか?
SHA-256 がファイル検証の標準です。配布元が提供しているアルゴリズムを使いましょう。選択肢があるなら、SHA-256 がセキュリティとパフォーマンスのバランスが良好です。
破損したファイルが正しいハッシュを持つことはありますか?
理論的には可能(衝突)ですが、SHA-256 では統計的に無視できるほどの確率です。可能性が天文学的に低いため、実用上はハッシュが同じならファイルも同じだと保証できます。
ファイルはサーバーに送信されますか?
いいえ。ハッシュは完全にブラウザ内で計算されます。ファイルがデバイスから出ることはなく、機密文書を含むあらゆる文書で安全に使えます。
What is the difference between a hash and a digital signature?
A hash proves a file has not changed since the hash was computed; anyone can verify it. A digital signature proves both integrity AND identity, the publisher signs the hash with their private key, and you verify with their public key. Hashes alone do not protect against a hacker who replaced both the file and the published hash on the same compromised mirror.
Why are MD5 and SHA-1 considered insecure?
Researchers have demonstrated practical collision attacks for both. In 2017 Google produced two different PDFs with identical SHA-1 hashes (the SHAttered attack), and MD5 collisions can be generated in seconds on a laptop. For deliberate-tamper detection use SHA-256 or stronger; MD5 and SHA-1 still work for catching accidental corruption but should never be trusted as security boundaries.