PowerShellでファイルのハッシュ値を確認する基本は、Get-FileHash -Algorithm SHA256 -Path "対象ファイル"です。配布元が示したSHA256と手元の結果が完全一致すれば、その基準値を作ったファイルと内容が同じである強い根拠になります。ただし、ファイルと基準ハッシュを同じ改ざんされたサイトから取得した場合、一致しても正規品とは証明できません。ハッシュは内容の同一性、電子署名は発行元と改ざん状態、マルウェア対策は既知脅威の検査という別の役割です。三つを混同せず、まず読み取り専用の確認から進めます。
SHA256を計算する基本コマンド
Get-FileHash -Algorithm SHA256 -Path "C:\Users\Public\Downloads\sample.iso"
出力にはAlgorithm、Hash、Pathが表示されます。Pathが意図したファイルか、同名の別フォルダーではないかを先に確認します。ハッシュ値は大文字・小文字を区別せず比較できますが、空白、改行、区切り記号を除いた同じ桁数の16進文字列として扱います。画面を目視するだけでは一文字の違いを見落とすため、PowerShellで比較結果をBooleanとして出します。
基準値と安全に比較する
$expected = "PUT_THE_OFFICIAL_SHA256_HERE"
$actual = (Get-FileHash -Algorithm SHA256 -Path "C:\Users\Public\Downloads\sample.iso").Hash
$actual -eq $expected
例のPUT_THE_OFFICIAL_SHA256_HEREは、配布元が別の信頼できる経路で示した完全なSHA256へ置き換えます。結果がTrueなら一致、Falseなら不一致です。不一致時にファイルを実行せず、URL、取得日時、ファイルサイズ、基準値の出典、再ダウンロード経路を確認します。スクリプトから自動削除すると調査証拠や誤判定時の正規ファイルを失うため、確認と処置を分けます。
比較前に$expectedの前後空白を除く場合も、Webページからコピーした値に見えない文字や「SHA256:」というラベルが混ざっていないかを確認します。正規表現で64桁の16進文字だけを許可すると入力ミスを検出できます。基準値が32桁ならMD5、40桁ならSHA1の可能性がありますが、桁数だけでアルゴリズムを断定せず配布元の表記を確認します。
SHA256を標準にする理由
Get-FileHashの既定アルゴリズムはSHA256です。Microsoftの公式説明は、MD5とSHA1が攻撃に対して安全ではなくなっていることを示しています。古いベンダーがMD5だけを公開している場合、転送ミスを見つける補助にはなっても、攻撃者を想定した完全性確認として十分ではありません。SHA256以上の基準値、Authenticode署名、HTTPSの公式配布元を組み合わせます。
SHA384やSHA512も指定できますが、「数字が大きいほど常に正しい」わけではありません。比較相手が公開したアルゴリズムと同じものを使う必要があります。SHA256の基準値に対してSHA512を計算すれば必ず異なります。台帳にはアルゴリズム名と値を別々の列で保存します。
複数ファイルをまとめて確認する
Get-ChildItem -LiteralPath "C:\Staging" -File | Get-FileHash -Algorithm SHA256
-LiteralPathを使うと、角括弧などをワイルドカードとして解釈せず文字どおりのパスを扱えます。大量ファイルや巨大イメージでは読み取りI/Oと時間がかかるため、本番サーバーの繁忙時間を避けます。再帰走査を無制限に行わず、対象ルート、ファイル種類、最大件数を決めます。結果には完全パスを含め、同名ファイルを区別します。
フォルダーそのものには標準的な一つのハッシュ値があるわけではありません。各ファイルのハッシュ、相対パス、順序、メタデータをどう組み合わせるかで結果が変わります。「フォルダーのハッシュ」とだけ書かれた独自スクリプトは、仕様を明示しないと他環境で比較できません。配布物がZIPなら、まずZIPファイル自体の公式ハッシュを確認し、展開後は必要に応じてマニフェストと比較します。
CSVマニフェストを作る
内部配布用マニフェストには、相対パス、ファイルサイズ、SHA256、作成日時ではなく収集日時、収集ツールの版を記録します。絶対パスにはユーザー名や社内構成が含まれるため、配布先で再利用するなら許可されたルートからの相対パスにします。マニフェスト自体も署名またはアクセス制御し、ファイルと同じ誰でも書き換えられる場所へ置かないことが重要です。
ストリームからハッシュを計算する
Get-FileHashは-InputStreamでも計算できます。ダウンロード処理やアーカイブ内データをストリームとして検証する設計に使えますが、ストリーム位置、閉じるタイミング、メモリ使用量を管理します。対話的なファイル確認なら-Pathまたは-LiteralPathのほうが明確です。ネットワーク越しの巨大ファイルは一度承認済み作業領域へ保存し、完全な取得後に確認します。
電子署名も確認する
Get-AuthenticodeSignature -FilePath "C:\Users\Public\Downloads\installer.exe"
Get-AuthenticodeSignatureは、Windows実行ファイルや署名可能なスクリプトなどのAuthenticode署名状態を確認します。StatusがValidか、SignerCertificateのSubjectが期待する発行元か、タイムスタンプや証明書チェーンをWindowsが検証できるかを見ます。ファイル名やアイコン、プロパティの会社名だけで発行元を判断しません。
署名がValidでも、そのソフトが組織で承認されている、安全な設定である、目的に適合することまで保証しません。逆にオープンソースのデータファイルなど署名対象でないものは、署名がないことだけで悪意とは決められません。配布元、ハッシュ、署名、評判、組織ポリシーを合わせます。オフライン環境では証明書失効確認が制限されるため、接続側の検証端末で確認してから搬入します。
ダウンロード検証の実務フロー
- 公式配布ページを開き、対象製品、版、OS、アーキテクチャを確認します。
- ファイルとSHA256を別の信頼できる表示または署名付きマニフェストから取得します。
- 保存先とファイルサイズを確認し、Get-FileHashでSHA256を計算します。
- PowerShellで完全一致を判定し、署名可能なファイルはAuthenticodeも確認します。
- 取得URL、日時、版、SHA256、署名結果、確認者を変更記録へ残します。
- 不一致・署名異常なら実行せず、配布元またはセキュリティ担当へ引き継ぎます。
コピー前後の同一性を確認する
USB媒体、ネットワーク共有、バックアップ先へコピーするときは、コピー元とコピー先で同じアルゴリズムのハッシュを計算します。元ファイルを検証済みとして固定し、コピー後に両値を比較します。ハッシュ一致は転送後の内容が同じことを示しますが、コピー元が正規かは別確認です。媒体番号、ファイル名、サイズ、ハッシュ、日時を台帳へ残します。
改行や再保存で値が変わる理由
ハッシュは1バイトでも内容が変われば大きく変化します。テキストの改行コード、文字コード、末尾改行、Office文書のメタデータ、ZIPの内部時刻が変わるだけでも一致しません。「見た目が同じ」ことと「バイト列が同じ」ことは違います。文書の意味が同じかを確認する用途には別の比較が必要です。ハッシュ不一致をすぐ改ざんと断定せず、再保存や変換の有無を調べます。
ログとプライバシー
ハッシュ値自体は元データを直接復元するものではありませんが、既知ファイルの照合や機密ファイルの存在推測に使われる可能性があります。完全パスにはユーザー名、案件名、共有名が入ることがあります。外部へ共有するログではパスを匿名化し、必要なアルゴリズム、ハッシュ、ファイルサイズ、取得元だけを残します。
よくある誤判定
- Trueだから安全:一致は基準ファイルとの同一性で、基準の信頼性が必要です。
- Falseだからマルウェア:転送失敗、別版、再保存、基準値のコピー誤りもあります。
- MD5が一致したから十分:攻撃を想定する確認にはSHA256と署名を使います。
- 署名者名が似ているから正規:Windowsの署名状態と証明書チェーンを確認します。
- フォルダー名が同じだから内容も同じ:各ファイルまたは仕様化したマニフェストで比較します。
確認完了の条件
確認完了は、実行したコマンド、対象の完全パス、アルゴリズム、実測値、基準値の出典、比較結果、署名状態、取得日時を説明できる状態です。不一致時の処置を自動化せず、実行前に止められることも重要です。定期処理では、取得失敗、ファイルなし、アクセス拒否、ハッシュ不一致、署名異常を別ステータスとして記録します。

コメント