2つのファイルが本当に同じか確認する ― PowerShellでSHA-256を使う

PowerShellカテゴリを表すパンダのイラスト PowerShell

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのGet-FileHashとNISTのSHA-256仕様を確認し、TEMP配下のダミーファイルで内容差を観察する形に整理しています。

検証ステータス:📘 Microsoft・NIST公式仕様確認済み・Windows実機未確認

ファイル名やサイズが同じでも、中身まで同じとは限りません。PowerShellの Get-FileHash でSHA-256を計算し、2つのdigestを比較すると、バックアップやコピー後の内容確認を簡単に行えます。

まず試す

TEMP配下だけにダミーファイルを作ります。

$dir = Join-Path $env:TEMP 'papanda-hash-demo'
New-Item -ItemType Directory -Path $dir -Force | Out-Null

'PANDA-001' | Set-Content (Join-Path $dir 'a.txt') -NoNewline
'PANDA-001' | Set-Content (Join-Path $dir 'b.txt') -NoNewline

$hashA = Get-FileHash (Join-Path $dir 'a.txt') -Algorithm SHA256
$hashB = Get-FileHash (Join-Path $dir 'b.txt') -Algorithm SHA256

$hashA
$hashB
"Same = $($hashA.Hash -eq $hashB.Hash)"

期待する観察点は Same = True です。

ここを見る

SHA-256はファイル内容から固定長のdigestを計算します。ファイル名ではなくbyte列が入力なので、同じ内容なら同じdigestになります。

flowchart LR
    A[File A] --> C[SHA-256]
    B[File B] --> D[SHA-256]
    C --> E{digest比較}
    D --> E
    E -->|同じ| F[内容一致を強く確認]
    E -->|違う| G[内容は異なる]

1か所変えてみる

b.txt の末尾だけ1文字変えます。

'PANDA-002' | Set-Content (Join-Path $dir 'b.txt') -NoNewline

$hashB2 = Get-FileHash (Join-Path $dir 'b.txt') -Algorithm SHA256
"Same = $($hashA.Hash -eq $hashB2.Hash)"

今度は False になります。1文字の変更でもdigestが大きく変わることを観察できます。

ハッシュは暗号化ではない

SHA-256はファイルを秘密にする機能ではありません。内容からdigestを作る一方向のhash functionです。NISTではSHA-256をSecure Hash Standardで定義しています。

hash collisionは理論上の概念として存在するため「同じdigestなら数学的に絶対同じ」とは言い切りません。ただし通常のファイルintegrity確認でSHA-256の一致を使うのは非常に強い確認方法です。

サイズ比較との違い

同じサイズのファイルでも内容は違えます。たとえば ABCXYZ はどちらも3文字ですが、中身は別です。

'ABC' | Set-Content (Join-Path $dir 'a.txt') -NoNewline
'XYZ' | Set-Content (Join-Path $dir 'b.txt') -NoNewline

Get-Item (Join-Path $dir '*.txt') | Select-Object Name, Length
Get-FileHash (Join-Path $dir '*.txt') -Algorithm SHA256

「サイズが同じ」は高速な一次確認にはなりますが、「内容が同じ」とは別です。

仕事で使うなら

  • NASへコピーした重要ファイルが元と同じか確認する

  • バックアップ復元後の検算をする

  • ベンダーから受領した配布ファイルを公式のSHA-256値と照合する

  • 同名ファイルが複数あるとき、中身が同一か分類する

大量ファイルではhash計算に読み込み時間がかかるため、件数・サイズを確認してから実行します。また「公式サイト掲載のhash値」自体が信頼できる経路から得られているかも重要です。

後始末

ダミーファイルだけ削除します。

Remove-Item -LiteralPath $dir -Recurse -Force

$dir を自分で指定したTEMP配下に限定している点も確認してください。

公式情報・一次情報

文書情報

記事タイトル
2つのファイルが本当に同じか確認する ― PowerShellでSHA-256を使う
作成日
更新日
Source URL
https://papanda925.com/?p=15620

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました