ファイルのハッシュ値:MD5・SHA-1・SHA-256とダウンロードの検証方法
ファイルハッシュとは、ファイルの内容から計算された固定長の値であり、ダウンロードしたファイルを参照コピーと比較する際によく使用されます。同じバイト列とアルゴリズムであれば同じ結果が得られますが、異なるファイルが理論上同じハッシュを持つこともあります。日常的なファイル検証には、提供元が SHA-256 を提示している場合はそちらを優先し、参照値がどこから来たのかを確認してください。
ファイルハッシュは何を表していますか?
ハッシュ関数はハッシュ値またはダイジェストと呼ばれる要約を計算します。MD5、SHA-1、およびSHA-256は、それぞれ固定の出力長を持っています:小さなドキュメントと大きなインストーラーは、同じアルゴリズムを使用すると同じ長さのダイジェストを生成します。ダイジェストは、ファイルを再構築できる圧縮コピーではありません。NISTのハッシュ関数の概要は、これらの特性と関連するセキュリティ要件を説明しています。
一般的なファイルハッシュツールは、ファイル名やフォルダの場所ではなく、ファイル内のバイトを読み取ります。内容を変更せずにファイル名を変更しても、ハッシュは変更されません。逆に、同じテキストを表示する2つの文書でも、行末コード、文字エンコーディング、ファイル内に保存されたメタデータの違いにより、含まれるバイトは異なる場合があります。
ハッシュは指紋のように表現できますが、絶対にユニークな識別子ではありません。異なる入力が同じダイジェストを生成する場合、衝突が発生します。安全な暗号学的ハッシュは、そのような入力を見つけることが現実的な計算資源では困難になるよう設計されています。MD5およびSHA-1は、衝突耐性のあるアプリケーションに必要なセキュリティ要件をもはや満たしていません。
MD5 vs SHA-1 vs SHA-256
MD5はMessage-Digest Algorithm 5の略であり、SHAはSecure Hash Algorithmの略です。SHA-256はSHA-2ファミリーに属し、256ビットを生成します。ツールは通常、結果を16進数のテキストとして表示します。各16進数文字は4ビットを表し、次の長さになります。
| アルゴリズム | ダイジェストサイズ | 16進数の長さ | ファイル検証の選択肢 |
|---|---|---|---|
| MD5 | 128ビット · 16バイト | 32文字 | レガシーチェックサムを比較する必要がある場合がありますが、悪意のある改ざんからの保護を確立するために使用すべきではありません。 |
| SHA-1 | 160ビット · 20バイト | 40文字 | 従来の参照と比較することができますが、新しいセキュリティアプリケーションには選ばないでください。 |
| SHA-256 | 256ビット · 32バイト | 64文字 | 発行者がSHA-256値を提供する場合の日常的なダウンロード整合性チェックに実用的な選択肢です。 |
MD5のサイズと衝突耐性の制限については、RFC 6151のMD5セキュリティ考慮事項で議論されています。SHAの仕様はNISTのSecure Hash Standardに示されています。偶発的な伝送エラーを検出することと、ファイルを改ざんできる攻撃者から防御することは、異なる要件です。
常に同じアルゴリズムのハッシュを比較してください。ローカルで計算したSHA-256値を公開されているMD5値と照合することはできません。また、256ビットの出力は、すべての種類の攻撃に対して256ビットの強度を意味するわけではありません。SHA-1の制限と攻撃タイプの違いについては、NISTのアルゴリズムおよびセキュリティ強度ガイダンスを参照してください。
1文字が変わった場合はどうなりますか?
このPythonの例では、ASCIIバイトabcとabCのSHA-256を計算します。最後の文字だけが変わり、どちらの入力も末尾に改行は含まれていません。表示された出力はPython 3.12で確認されました。両方のダイジェストは64文字の16進数で構成されています。
import hashlib
for data in (b"abc", b"abC"):
print(data.decode("ascii") + ": " + hashlib.sha256(data).hexdigest())
出力:
abc: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
abC: 0a2432a1e349d8fdb9bfca91bba9e9f2836990fe937193d84deef26c6f3b8f76
これらの見た目が似ている入力でも、非常に異なるダイジェストを生成します。この例は、すべての異なる入力ペアが必ず異なるハッシュを持つことを証明するものではありません。同じ入力から常に同じ出力が得られる性質、可能な衝突、意図的な攻撃に対する耐性は、それぞれ別の特性です。
ダウンロードしたファイルを確認する方法
整合性検証は、データが参照と異なるかどうかを確認するものです。新しいダイジェストを計算するだけでは検証にはなりません:信頼できる参照ハッシュと比較する必要があります。
- 参照ハッシュは、発行元の公式ダウンロードページまたはその他の信頼できる配布チャネルから取得してください。
- オペレーティングシステム、CPUアーキテクチャ、バージョン、ファイル名がダウンロードと一致していることを確認してください。参照が使用しているアルゴリズムを確認します。
- ダウンロードが完了するのを待ってから、同じアルゴリズムでハッシュを計算してください。ファイルを読み取っている間に変更したり上書きしたりしないでください。
- SHA-256の場合、最初だけでなく64個の16進文字すべてを比較してください。大文字と小文字の16進文字は同じ値を表します。
- 値が異なる場合は、ファイルを実行したりインストールしたりしないでください。比較対象を再確認し、公式チャネルから再度ダウンロードして検証を繰り返してください。
攻撃者がファイルとその参照ハッシュの両方を置き換えることができる場合、値が一致しても誰が提供したかを示すものではありません。一致は参照データとの比較であり、ファイルにマルウェアが含まれていないことの証明ではありません。署名付きチェックサムやデジタル署名が提供されている場合は、発行者の指示に従い、信頼できる公開鍵で検証してください。
Windows、Linux、macOS向けのSHA-256コマンド
example.iso は説明用のファイル名です。これを実際のダウンロードファイル名とパスに置き換え、スペースを含むパスは引用符で囲んでください。これらのコマンドはファイルを読み取ってダイジェストを計算しますが、内容を変更することはありません。
Windows: PowerShellのGet-FileHash
スタートメニューからPowerShellを開き、次のコマンドを実行します。-LiteralPath はワイルドカード文字を解釈せず、パスを文字通り扱います。-Algorithm SHA256 はアルゴリズムを明示的に選択します。
Get-FileHash -LiteralPath 'C:\Downloads\example.iso' -Algorithm SHA256 | Format-List
Algorithm、Hash、Path フィールドを確認してください。SHA-256 がデフォルトですが、指定すると比較がより明確になります。Microsoft の Get-FileHash ドキュメント には、サポートされているアルゴリズムと出力形式が記載されています。ファイルが見つからない場合は、エクスプローラーで実際のパスと拡張子を確認してください。
Linux: sha256sum
GNU Coreutils sha256sum がインストールされている環境では、ターミナルを開き、このコマンドを実行してください。通常の出力には、ダイジェストの後にファイル名が続きます。
sha256sum "/home/user/Downloads/example.iso"
もし配布元がGNU形式のSHA256SUMSファイルを提供している場合、それを検証するファイルと一緒に置き、フォルダ内でターミナルを開き、以下のコマンドでリストを確認してください。リストに記載されているパスは存在している必要があります。すべてのリストは、その一部の項目だけをダウンロードした場合、欠落ファイルが報告されることがあります。
sha256sum --check SHA256SUMS
一致する項目はOKとして報告され、非一致は失敗として報告されます。チェックサムリスト自体も信頼できるソースからのものでなければなりません。コマンドとチェックオプションについてはGNU SHA-2ユーティリティマニュアルを参照してください。コマンドが見つからない場合は、ディストリビューションにCoreutilsがインストールされているか確認してください。
macOS: shasum
もし端末でshasumが利用可能であれば、-a 256でSHA-256を明示的に選択してください。そのオプションがない場合、shasumはデフォルトでSHA-1になり、アルゴリズムの不一致を引き起こす可能性があります。
shasum -a 256 "/Users/user/Downloads/example.iso"
互換性のあるチェックサムリストについては、shasum -a 256 -c SHA256SUMSを使用してください。shasumメンテナのドキュメントは、アルゴリズムの選択と-cについて説明しています。これらのmacOS用手順は、macOS上での実行によるものではなく、ツールのドキュメントに基づいています;下記のPythonメソッドは、ツールが利用できない場合の代替手段です。
Pythonで大きなファイルのSHA-256を計算する
Python 3がインストールされていれば、標準ライブラリのhashlibモジュールを利用できます。このコードをhash-file.pyとして保存してください。ファイルをバイナリモード(rb)で開き、一度に1メビバイト(MiB)ずつ読み込むため、ファイル全体をメモリに読み込む必要はありません。代入式を使っているためPython 3.8以降が必要です。
import hashlib
import sys
if len(sys.argv) != 2:
raise SystemExit("Usage: python hash-file.py FILE")
digest = hashlib.sha256()
with open(sys.argv[1], "rb") as file:
while chunk := file.read(1024 * 1024):
digest.update(chunk)
print(digest.hexdigest())
スクリプトのフォルダから、実際のファイルのパスを次のように渡します。Python 3 のコマンドが python3 または py の場合は、そのコマンドを python の代わりに使用してください。
python hash-file.py "example.iso"
出力は64文字の16進数のSHA-256ダイジェストです。同一のバイトは、PowerShellや他のツールと同じ結果になりますが、文字の大文字小文字は異なる場合があります。公式のPython hashlibドキュメントはupdate()およびhexdigest()について説明しています。小さなファイル、空のファイル、多チャンクのファイルは、Python 3.12.14およびPowerShell 7.6.5でWindows上で確認され、結果が一致することが確認されました。
ハッシュが一致しない場合に確認すべきこと
- 異なるリリースファイル: x64とARM64、インストーラーとアーカイブ、または異なるバージョンを確認してください。
- 異なるアルゴリズム: MD5、SHA-1、SHA-256では異なるダイジェストが生成されます。アルゴリズム名を再確認してください。
- ダウンロードが不完全: ダウンロードが完了しており、ダウンロードツールがエラーを報告していないことを確認してください。
- 抽出または変換: アーカイブの参照ハッシュは、そこから抽出されたファイルには適用されません。エディタでの保存、改行コードの変換、画像の再圧縮によってバイトが変わる可能性があります。
- パスやコピーのミス: コマンドで実際に読み取ったファイルおよび全体の参照値を確認してください。切り詰められたダイジェストや他のファイルからコピーされたものを避けてください。
一致させるために説明のない参照値を自分で計算した値に置き換えないでください。まず配布チャンネルとターゲットを確認してください。もし新規ダウンロードでもまだ異なる場合、配布元の指示やリリースが修正されているかどうかを確認してください。
ハッシュができることとできないこと
| 使用 | ハッシュの役割 | 追加要件 |
|---|---|---|
| ファイルの整合性 | 現在のファイル内容を参照ダイジェストと比較する。 | 参照元とアルゴリズムは適切でなければならない。 |
| 重複検出 | 一致するハッシュを持つファイルを重複候補としてグループ化する。 | 衝突の可能性を考慮し、正確な一致が必要な場合はバイトを比較する。 |
| デジタル署名 | 署名スキームはデータのダイジェストを使用する場合がある。 | ハッシュを計算するだけでは、署名を作成したり、作者を認証したりすることはできません。 |
| パスワードの保存 | パスワードの検証もハッシュベースのメカニズムを使用します。 | 一般的なファイル用のSHA-256ハッシュ計算の代わりに、専用のパスワード保存方法を使用してください。 |
ハッシュ化は暗号化ではありません。暗号化は、適切な鍵で平文を復元できることを目的としていますが、ハッシュは入力を再構築する形式ではありません。ただし、短い入力や予測可能な入力は推測され、そのハッシュと比較される可能性があるため、単にハッシュ化するだけでは秘密性は保証されません。
パスワードについては、MD5、SHA-1、SHA-256を単独で使う代わりに、コストが適切でユニークなソルトを使用したArgon2idのような専用のパスワードハッシュ方式の信頼できる実装を選んでください。ソルトは、事前計算された推測攻撃をあまり効果的でなくするための、パスワードごとの値です。OWASPパスワードストレージチートシートでは、パスワードの保存とファイルハッシュが異なる設計を必要とする理由を説明しています。ダウンロードのチェックについては、基本的な手順はSHA-256の計算、信頼できる参照の取得、および完全なダイジェストの比較です。




