PowerShell のGet-FileHashでダウンロードファイルのSHA256を確認する方法
公式サイトからダウンロードしたインストーラーが正規品かどうか確認したいとき、PowerShell の Get-FileHash コマンドが役立ちます。追加インストール不要で、標準の PowerShell から即座に使えます。
どんな場面で使うか
- ダウンロードファイルの検証: 配布元サイトに掲載されたハッシュ値と突き合わせ、ダウンロード中の破損や差し替えがないか確認する。
- 改ざん検知: 重要なファイルのハッシュ値を保存しておき、後日再計算して値が変わっていないか確認する。ファイルの中身が1バイトでも変わればハッシュ値は別物になる。
- バックアップの整合性確認: コピー元とコピー先のファイルのハッシュ値を比較し、コピー中の破損がないかをファイルサイズより厳密にチェックする。
基本的な使い方
PowerShell を開き、以下を実行します(デフォルトは SHA256)。
Get-FileHash .\setup.exe
出力例:
Algorithm Hash Path
--------- ---- ----
SHA256 3A7BD3E2360A3D29EEA436FCFB7E44C735D117C42D1C1835420B6B9942DD4F1B C:\...\setup.exe
“Hash” 列の値を、公式サイトに記載されている SHA256 値と目視で比較します。
ハッシュ値を1行で比較する
目視での比較はミスが起きやすいため、比較式で確認する方法がおすすめです。
(Get-FileHash .\setup.exe).Hash -eq "3A7BD3E2360A3D29EEA436FCFB7E44C735D117C42D1C1835420B6B9942DD4F1B"
True が返れば一致、False なら不一致です。ハッシュ値の大文字小文字は問いません。
アルゴリズムを指定する
SHA256 以外のハッシュアルゴリズムを使いたい場合は、-Algorithm オプションで切り替えられます。
# MD5
Get-FileHash .\setup.exe -Algorithm MD5
# SHA512
Get-FileHash .\setup.exe -Algorithm SHA512
対応アルゴリズム(SHA1・SHA256・SHA384・SHA512・MD5・MACTripleDES・RIPEMD160)の詳細は Microsoft 公式ドキュメント を参照してください。
どれを使うか迷ったら、基本は SHA256 で問題ありません。配布元が SHA256 のハッシュ値しか公開していないケースがほとんどだからです。まれに古いソフトウェアで MD5 や SHA1 の値しか公開されていない場合があり、その際は配布元が示しているアルゴリズムに合わせて -Algorithm を切り替えます。MD5・SHA1 は衝突耐性が弱く暗号用途には向きませんが、単純な破損検知や差し替えチェック程度であれば実用上は困りません。より高いセキュリティ要件がある場合は SHA384・SHA512 を選ぶとよいでしょう。
複数ファイルをまとめてハッシュ計算する
フォルダ内の複数ファイルを一括でチェックしたいときは、Get-ChildItem と組み合わせます。
Get-ChildItem .\downloads\ -File | Get-FileHash
特定の拡張子だけに絞りたい場合は -Filter を使います。
Get-ChildItem .\downloads\ -File -Filter *.exe | Get-FileHash -Algorithm SHA256
サブフォルダも含めてまとめて計算したい場合は -Recurse を追加します。
Get-ChildItem .\downloads\ -Recurse -File | Get-FileHash
計算結果をCSVに保存して後から比較する
大量のファイルを扱う場合や、後日改めて改ざんの有無を確認したい場合は、計算結果をCSVファイルに保存しておくと便利です。
Get-ChildItem .\downloads\ -Recurse -File | Get-FileHash | Export-Csv -Path .\hashes.csv -NoTypeInformation
-NoTypeInformation を付けると、CSVの1行目に不要な型情報が出力されず、Excel等でそのまま開ける形式になります。
後日、同じフォルダで再計算した結果と突き合わせて差分を確認する場合は、Compare-Object を使います。
$before = Import-Csv .\hashes.csv
$after = Get-ChildItem .\downloads\ -Recurse -File | Get-FileHash
Compare-Object $before $after -Property Hash, Path
出力が何もなければ、保存時から内容が変わっていないことになります。差分が出た場合は、該当する Path のファイルが書き換わった(または削除・追加された)ことを意味します。
よくあるつまずきポイント
- パスにスペースが含まれる場合: “C:\Program Files\hoge.exe” のようにパスにスペースが含まれるときは、必ずダブルクォートで囲んでください。囲まないと別々の引数として解釈され、エラーになります。
- アクセス拒否エラー: システム保護領域のファイルなど、実行中のPowerShellの権限では読み取れないファイルを指定すると、アクセス拒否のエラーになることがあります。管理者としてPowerShellを起動し直すと解消するケースが多いです。
- Get-ChildItem との組み合わせでエラーが出る場合: パイプライン経由でファイルを渡した際にアクセス拒否が出ることがありますが、多くは対象ファイル自体の権限の問題です。個別に Get-FileHash を実行して原因のファイルを切り分けると特定しやすくなります。
ブラウザ上でハッシュ値を確認したい場合
コマンドを使わずにファイルのハッシュ値を手軽に確認したいときは、ハッシュ計算ツール をお使いください。ファイルをブラウザ上にドラッグするだけで SHA256・MD5 などを計算できます。