同じ名前のファイルなのに中身が違う? SHA-256で一致を確かめる

友達から受け取った写真や資料を、元のファイルと比べたいときがあります。「ファイル名が同じ」「容量も同じ」なら同一だと考えがちですが、実は中身が違う可能性もあります。ファイルの内容を短い数字と文字の列に変換する「ハッシュ値」を使うと、もう一段詳しく確認できます。

名前や容量だけでは内容を証明できない

同じ名前のファイルを別のフォルダーに保存することはできます。上書きしたり、一文字だけ修正して同じ名前で保存したりもできます。したがってファイル名は管理の手がかりになりますが、中身の完全な一致を保証するものではありません。

さらに、容量が同じ場合でも中身が異なることがあります。例えば「ABCD」という四文字と「ABCE」という四文字は、同じような文字数ですが最後の文字が違います。ファイルのサイズは、その違いを直接教えてくれません。

そこでファイル全体を計算にかけ、短い固定長の値を作る方法が使われます。SHA-256というアルゴリズムでは、入力がどんな長さでも通常256ビットのハッシュ値を得ます。16進数で表示すると64文字の列になります。これをファイルの指紋のように使って比べます。

一文字だけ変えたときに起きること

元の文章ファイルと、一か所だけ書き換えたファイルを用意してください。それぞれのSHA-256を調べ、結果を比べます。通常はまったく違うように見える文字列になります。どの文字が変わったかまでは教えてくれませんが、内容が一致していないことに気づけます。

実験で注意したいのは「文字として同じに見える」ことと「保存されたバイト列が同じ」であることの違いです。改行コードや文字コードが変われば、画面上ではほぼ同じ文章でもハッシュ値は違うことがあります。逆にコピー元とコピー先のSHA-256が一致すれば、偶然同じ値になる極めて小さい可能性を除き、同一のデータと判断する強い材料になります。

SHA-256は、元の文章を暗号化して誰でも復号できる形で保存するものではありません。ハッシュ値から元のファイルを作り直すための道具でもありません。目的は内容を比べることであり、元データの保管や復元ではないのです。

ハッシュ値を使って配布ファイルを確認する

ソフトウェアの配布ページにはSHA-256値が掲載されることがあります。ダウンロードしたファイルの値を自分の端末で計算し、公式ページの値と一文字ずつ比較すると、配布元が示したデータと一致しているか確認できます。

ただし、比較する「正解の値」が信頼できる場所から提供されたものでなければ意味が薄れます。悪意のある第三者がファイルとハッシュ値を両方すり替えた場合、二つを照合しても危険を見つけられないからです。ハッシュ値の一致は、ファイルが安全であることや発行者が本物であることを単独で証明しません。

元の値の入手先、計算の方法、照合した日時も記録すると、後から確認しやすくなります。重要な配布物では、電子署名など別の検証手段も組み合わせて判断します。ハッシュ値と署名は似た言葉として語られることがありますが、役割は違います。

Windowsで実際に確かめる手順

Windowsでは、PowerShellの Get-FileHash コマンドを使ってSHA-256を計算できます。ファイルの保存場所を指定し、出てきた長い文字列を比較します。二つのファイルの名前が違っていても、内容が完全に同じなら同じ値になるはずです。

例として、ファイルAをコピーしてBを作り、AとBの値を比較します。次にBを文字編集できる形式にした上で一文字を書き換えて保存し、再度比較します。最初の一致と、変更後の不一致を続けて見ると、チェックの意味が実感できます。個人情報を含むファイルを他人のオンライン計算サイトへアップロードする必要はありません。

結果が違ったときは「どちらが正しいか」までは分かりません。編集前の正本や、信頼できる配布元の記録が必要です。ハッシュは変更を発見するための手段であって、版管理やバックアップの代わりではないと覚えておきましょう。

macOSのターミナルでは「shasum -a 256 ファイル名」、Linuxでは「sha256sum ファイル名」でSHA-256を計算できます。どちらも信頼できる環境で実行し、得られた64文字の16進数を正本の値と照合します。

一致と安全を混同しない

同じハッシュ値が出たからといって、そのファイルにウイルスがないとは言えません。危険な内容のファイルでも、その危険な状態のまま一致することはあります。逆に値が違っても、正当な更新が行われただけの場合もあります。何を証明したいのかを最初に区別する必要があります。

SHA-256のような暗号学的ハッシュ関数は、内容の変化を検出するために広く利用されています。NISTのSecure Hash Standardも、メッセージのダイジェストを作り、元のメッセージから変化したかを調べられる用途を示しています。だからこそ、比較する値の取り扱いが重要です。

実験が終わったら「ファイル名」「容量」「SHA-256」「入手元」の四つを並べた表を作ると便利です。同じ名前という表面的な一致から、内容という別のレベルの一致へ調べる視点を切り替えられます。

実際の照合で使うときの三つの注意

一つ目は、計算する対象を間違えないことです。圧縮前のファイルとZIPに入れた後のZIPファイルは、内容の表し方が違うため、通常はハッシュ値も違います。比較したいのが元の文書なら、展開した元の文書同士を比べましょう。二つ目は、ダウンロード途中の未完成ファイルを比較しないことです。取得が完了してから計算します。

三つ目は、公開されたハッシュ値がいつの版に対応するかを確認することです。ソフトウェアが更新されれば、同じ名称でも別のバージョンのファイルになり、値も変わるはずです。違う値が出ても、すぐに改ざんと断定せず、版数や配布日時が合っているかを確かめます。

さらに、長い値を目で照合するときは、先頭と末尾だけでなく全文を比べる必要があります。自動比較できるなら、手作業の転記ミスを減らせます。このように、正しい計算式だけでなく、正しい対象・正しい基準値・正しい手順がそろって初めて検証になります。

参考資料

おすすめの記事