ファイルが同じか確かめるには?──ハッシュ値(SHA-256)の読み方と比べ方
ダウンロードしたファイルが公式のものと同じか、コピーで壊れていないかは、ハッシュ値(SHA-256)で確かめられます。64桁の読み方、大文字小文字や改行で値が変わる場面、macOSとPowerShellでの計算方法、比べるときの落とし穴を整理します。
この記事のポイント
- SHA-256は256ビット、16進数で64桁。1文字違えば別のファイル
- 大文字小文字は同じ値。改行や空白が1つ増えれば値は別物になる
- 「ハッシュを整える」にファイルを入れ、公式の値と照合できる
- Q.
- ハッシュ値が一致すれば、ファイルは同じだと言える?
- A.
- 同じ方式で計算して一致すれば、同じ内容のファイルとみなせます。SHA-256で別のファイルが同じ値になることは現実的には起こらないとされています。ただし、比べる側の値を載せたページ自体が改ざんされていないことが前提です。
ソフトウェアをダウンロードするとき、配布ページに「SHA-256: 2cf24dba…」のような長い文字列が載っていることがあります。これはファイルの内容から計算した「指紋」で、手元のファイルが公式のものと同じか、ダウンロード中に壊れていないかを確かめるために使います。
結論を先に書きます。
SHA-256のハッシュ値は256ビットで、16進数にすると64桁になります。公式ページの値と、手元のファイルから計算した値が1文字も違わず一致すれば、同じ内容のファイルです。1文字でも違えば別の内容で、ダウンロードの失敗か、中身の差し替えを疑います。この記事の仕様は、NIST(米国国立標準技術研究所)の FIPS PUB 180-4「Secure Hash Standard」(2015年8月)によります。計算例は、この記事の用意のために実際に計算した値です。
ハッシュ値とは
ハッシュ関数は、どんな長さのデータでも、決まった長さの値に変換する関数です。FIPS 180-4は、この変換結果をメッセージダイジェストと呼んでいます。同じ入力からは必ず同じ値になり、入力が少しでも変わると、値は大きく変わります。
FIPS 180-4が定める主なアルゴリズムの出力の長さは、次のとおりです。
| アルゴリズム | 出力(ビット) | 16進数の桁数 |
|---|---|---|
| SHA-1 | 160 | 40 |
| SHA-256 | 256 | 64 |
| SHA-384 | 384 | 96 |
| SHA-512 | 512 | 128 |
16進数は1桁で4ビットを表すので、桁数はビット数を4で割った値です。SHA-256なら256÷4で64桁です。MD5はFIPS 180-4の対象外で、128ビット(32桁)です。
FIPS 180-4は、これらのアルゴリズムが「安全」と呼ばれる理由を2つ挙げています。ある値になる入力を探し出すことと、同じ値になる異なる2つの入力を探し出すことが、計算上現実的でないことです。また、メッセージが変わると、非常に高い確率で別のダイジェストになる、とも書かれています。
1文字で値が大きく変わる
実際に計算した例です。文字列「hello」と、末尾に「!」を足した「hello!」のSHA-256を比べます。
| 入力 | SHA-256(16進数64桁) |
|---|---|
| hello | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
| hello! | ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b |
入力が1文字違うだけで、64桁のうち62桁が別の文字になりました。ビットで数えると、256ビットのうち130ビットが違います。値の見た目が少し似ているから「ほぼ同じファイル」ということはありません。一致か不一致かの2択です。
何も入っていない(空の)データのSHA-256は、e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 です。ダウンロードが失敗して0バイトのファイルができたときは、この値が出ます。
ファイルのハッシュ値を計算する
ファイルの内容そのものをSHA-256にかけます。ファイル名や日付は関係せず、名前を変えても、移動しても、中身が同じなら値は同じです。
- macOS:ターミナルで
shasum -a 256 ファイル名 - PowerShell(Windows):
Get-FileHash ファイル名。マイクロソフトの資料では、アルゴリズムを指定しないときの既定はSHA256です。SHA1・SHA384・SHA512・MD5も-Algorithmで選べます - ブラウザで:ハッシュを整える にファイルをドラッグ&ドロップします。ファイルは端末の外に送信されません
PowerShellの出力は、英字が大文字で表示されます。macOSの出力は小文字です。表示が違っていても、16進数の英字の大文字・小文字は同じ値を表します。比べるときは、どちらかに揃えてください。
比べるときの落とし穴
- 途中の数文字だけを比べない:先頭や末尾の数文字だけ見て「合っている」と判断しないでください。64桁すべての比較が前提です。貼り付けて自動で照合できる場面では、機械に任せたほうが確実です
- 前後の空白や改行:公式の値をコピーするとき、行末の空白や改行が一緒に付くことがあります。値そのものが違うのではなく、比べる文字列に余計な文字が混ざっただけの場合があります
- テキストの改行:文字列のハッシュは、改行1つで変わります。上の「hello」の末尾に改行(1文字)を足した入力のSHA-256は
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03で、改行なしの値とは別物です。ファイル全体のハッシュなら、改行コードの違い(WindowsとmacOSの差)でも値が変わります - 方式を揃える:公式がSHA-256で載せているのに、SHA-1やMD5で計算した値と比べても一致しません。桁数(64桁か40桁か32桁か)で方式を見分けられます
- 比べる値の出どころ:ファイルと同じページに載っているハッシュ値は、ページごと差し替えられると意味がなくなります。ハッシュ値の照合が確かめるのは「公式が載せた値と同じか」で、「公式の値そのものが正しいか」までは保証しません。配布元が電子署名も付けている場合は、署名の確認も組み合わせます
MD5とSHA-1の位置づけ
マイクロソフトの Get-FileHash の資料は、MD5とSHA1はもはや安全とはみなされておらず、攻撃や改ざんからの保護が必要なファイルには使わず、単純な変更の検知にとどめるよう書いています。公式サイトがMD5だけを載せている場合でも、転送中の破損を見つける目的なら使えますが、改ざんの検出には向きません。選べるなら、SHA-256を使ってください。
照合の手順
- 配布元が載せているハッシュの方式(SHA-256など)と、値を確認する
- 同じ方式で、手元のファイルのハッシュ値を計算する
- 64桁をすべて比べ、完全に一致するか確かめる
ハッシュを整える なら、ファイルを入れたあと、公式のSHA-256を貼って一致を確認できます。一致すれば、ダウンロードの途中で壊れたり、中身が差し替えられたりしていない可能性が高いと判断できます。
まとめ
- SHA-256は256ビット、16進数で64桁。SHA-1は40桁、SHA-512は128桁
- 入力が1文字違うだけで値は別物になる。「hello」と「hello!」では64桁のうち62桁が違う
- 16進数の英字は大文字小文字を区別しない。改行や空白の混入には注意する
- 一致が確かめるのは「公式の値と同じか」。公式の値の出どころも確認する