md5sum / sha256sum 入門 - チェックサムで改ざん・破損を検証する

md5sum / sha256sum 入門 - チェックサムで改ざん・破損を検証する

この記事で学べること

  • チェックサム(ハッシュ) が何のためにあるのかが腑に落ちる
  • sha256sum / md5sumファイルの指紋を計算 できる
  • -c を使って 「壊れていないか」「すり替えられていないか」を照合 できる
  • 破損検出改ざん検出 の違い、そして なぜ今 MD5 が非推奨なのか が分かる

結論(先に覚える型)

  • とりあえず指紋を見たい → sha256sum file
  • 公式サイトの値と一致するか確認したい → sha256sum -c SHA256SUMS
  • 改ざん対策なら SHA-256。MD5 / SHA-1 は 偶発的な破損検出にしか使わない

前提(対象環境)

  • OS:Ubuntu / 一般的な Linux
  • md5sum / sha256sum は GNU coreutils に含まれ 標準搭載(追加インストール不要)
  • 同じ仲間に sha1sum / sha512sum / b2sum などがある

1. チェックサムって何?

結論: チェックサムはファイルの中身から計算する「指紋」。中身が1ビットでも変われば値が大きく変わる。

リナ: 先輩、ダウンロードページに「SHA256: a1b2c3...」みたいな長い文字列が載ってることありますよね? あれ何ですか?
ライニー先輩: それが チェックサム、別名 ハッシュ値 だよ。ファイルの中身を全部読み込んで計算する「指紋」のようなもの。同じ中身なら必ず同じ値になる。
リナ: 指紋... ファイルごとに違うってことですか?
ライニー先輩: その通り。しかも中身が たった1ビット 変わるだけで、指紋の値はガラッと別物になる。だから「ダウンロードしたファイルが本物と同じか」を一瞬で確認できるんだ。

チェックサムでできること

  • ダウンロードしたファイルが 途中で壊れていないか(破損検出)
  • 配布元と 中身が同じか(すり替え・改ざんの検出)
  • 2 つのファイルが 完全に同一か の比較

2. sha256sum で指紋を計算する

結論: sha256sum file でハッシュを計算する。出力は「ハッシュ+スペース2つ+ファイル名」の形式。

2-1. 基本:1 ファイルの指紋を出す

$ sha256sum ubuntu.iso
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  ubuntu.iso
リナ: わっ、すごく長い文字列が出ました。後ろにファイル名も付いてますね。
ライニー先輩: それが SHA-256 の指紋。64 桁の 16 進数で、これが一致すれば中身は同じとみなせる。間の スペースは2つ で、ここが後で照合に効いてくるよ。

出力の読み方

e3b0c4...b855  ubuntu.iso
└─ ハッシュ値 ─┘└┘└ ファイル名
              2つのスペース
  • 1 つ目のスペースは区切り
  • 2 つ目の文字は 入力モード =テキスト / *=バイナリ)を表す
  • GNU 版では両モードに中身の差はない(歴史的な互換用)

2-2. md5sum も使い方は同じ

$ md5sum ubuntu.iso
d41d8cd98f00b204e9800998ecf8427e  ubuntu.iso

md5sum は MD5、sha256sum は SHA-256 を計算するだけで 使い方は全く同じsha1sum / sha512sum も同様。

3. 複数ファイルと一覧の保存

結論: 複数ファイルをまとめて計算でき、> で一覧ファイルに保存しておけば後で -c 照合に使える。

3-1. 複数ファイルを一括で

$ sha256sum *.iso
e3b0c4...b855  ubuntu.iso
9f86d0...0a08  debian.iso

3-2. 一覧をファイルに保存

$ sha256sum *.iso > SHA256SUMS

SHA256SUMS という名前は配布サイトでよく使われる慣習。中身は「ハッシュ+ファイル名」が並んだただのテキスト。

リナ: この一覧、あとで何に使うんですか?
ライニー先輩: 次の -c で「保存しておいた指紋と、今のファイルが一致するか」をまとめて照合できる。バックアップが壊れていないかの定期チェックにも便利だよ。

4. -c で照合する(ここが本番)

結論: sha256sum -c 一覧ファイル で、記録済みハッシュと現在のファイルを照合する。一致なら OK、不一致なら FAILED

4-1. 一覧と照らし合わせる

$ sha256sum -c SHA256SUMS
ubuntu.iso: OK
debian.iso: OK

中身が変わっていたら、こうなる。

ubuntu.iso: OK
debian.iso: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
リナ: FAILED が出たら、それは壊れてるってことですか?
ライニー先輩: 「保存した指紋と今の中身が違う」という意味。原因はダウンロードの破損か、誰かによるすり替えのどちらか。どちらにせよ そのファイルは使わない のが正解だよ。

4-2. 配布元の値 1 つと照合する

ダウンロードページに「SHA256: 公式の値」が 1 行だけ載っている場合は、その 1 行を一覧ファイルにして照合できる。

# 公式の値とファイル名を 1 行で書く(スペースは2つ)
$ echo "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  ubuntu.iso" > check.txt
$ sha256sum -c check.txt
ubuntu.iso: OK

スペースは必ず2つ

一覧ファイルの「ハッシュ」と「ファイル名」の間は 半角スペース2つ。1 つだとフォーマット不正で照合に失敗する。sha256sum の出力をそのまま使えば間違えない。

4-3. 検証で便利なオプション

# OK 行を出さず、失敗だけ表示
$ sha256sum -c --quiet SHA256SUMS

# 一覧に無いファイルを無視(一部だけ確認したいとき)
$ sha256sum -c --ignore-missing SHA256SUMS

# 何も表示せず終了コードだけで判定(スクリプト向け)
$ sha256sum -c --status SHA256SUMS && echo "全て一致"

--status は結果を画面に出さず、終了コード(成功 0 / 失敗 1)だけで判断する。シェルスクリプトでの自動チェックに向く。

5. 破損検出と改ざん検出は別物

結論: 偶発的な破損の検出はどのハッシュでもできるが、悪意ある改ざんへの防御は SHA-256 を使う必要がある。

リナ: 破損の検出と改ざんの検出って、同じじゃないんですか?
ライニー先輩: 似ているけど違う。破損 は通信エラーやディスク不良で「勝手に壊れる」こと。改ざん は攻撃者が「指紋を一致させたまま中身をすり替える」ことを狙ってくる。後者に耐えるには、指紋を意図的に衝突させられないハッシュが必要なんだ。

2 つの目的

目的 何を防ぐ 使えるハッシュ
破損検出 通信・ディスク由来の偶発破損 MD5 / SHA-1 でも可
改ざん検出 攻撃者による意図的なすり替え SHA-256 以上を推奨

6. なぜ今 MD5 は非推奨なのか

結論: MD5 と SHA-1 は「異なる中身で同じ指紋」を作る衝突攻撃が現実的になったため、セキュリティ用途では非推奨。

リナ: MD5 ってよく見かけますけど、使っちゃダメなんですか?
ライニー先輩: 「絶対ダメ」ではなく 用途次第。MD5 と SHA-1 は 衝突攻撃 が現実的になっている。これは攻撃者が「中身は違うのに指紋は同じ」という2つのファイルを意図的に作れてしまう、という意味だよ。
リナ: それだと、指紋が一致してても安心できない...
ライニー先輩: そう。だから 改ざん対策には MD5 / SHA-1 は使わない。ただし、通信途中の偶発的な破損を見つけるだけなら今でも十分使える。迷ったら SHA-256 を選べば間違いない。

7. よくある初心者のつまずき

結論: 大文字小文字の見間違い、スペースの数、改行コード混入が照合失敗の典型原因。

7-1. 目視で比較して見落とす

64 桁を目で比べるのは事故のもと。必ず -c で機械的に照合 する。

# NG: 目で見比べる(見落とす)
# OK: 一覧にして -c で照合
$ sha256sum -c SHA256SUMS

7-2. FAILED の原因がスペース

一覧ファイルの区切りが スペース1つ だとフォーマット不正になる。

sha256sum: SHA256SUMS: 1 line is improperly formatted

sha256sum file > SHA256SUMS で作った一覧をそのまま使えば、スペースは正しく2つになる。

7-3. Windows で作った一覧がうまく照合できない

Windows 由来のファイルは改行が \r\n(CRLF)で、末尾の \r が悪さをすることがある。

# CRLF を LF に直してから照合
$ tr -d '\r' < SHA256SUMS.txt | sha256sum -c -

7-4. ハッシュが一致するのに「違うファイル」に見える

ファイル名が違うだけで 中身が同じ なら、ハッシュは一致する。ハッシュは 中身だけ を見て、ファイル名や更新日時は見ないことを覚えておく。

8. ミニ課題:手を動かして確かめよう

結論: 自分でファイルを作り、ハッシュ計算・一覧保存・照合・破損検出の流れを実際に体験して定着させる。

リナ: 知識は入りました! 実際に試したいです。
ライニー先輩: テスト用のファイルを作って試すのが一番。3 問用意したよ。

課題 1echo hello > a.txt でファイルを作り、その SHA-256 ハッシュを表示しよう。

ヒントを見る

SHA-256 を計算するコマンドにファイル名を渡すだけ。

解答例
$ echo hello > a.txt
$ sha256sum a.txt
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03  a.txt

課題 2a.txt のハッシュ一覧を SUMS に保存し、-c で照合して OK を確認しよう。

ヒントを見る

> SUMS で保存してから、-c SUMS で照合する。

解答例
$ sha256sum a.txt > SUMS
$ sha256sum -c SUMS
a.txt: OK

課題 3a.txt の中身を書き換えてから再度 -c で照合し、FAILED が出ることを確認しよう。

ヒントを見る

ファイルに何か追記してから、もう一度 -c SUMS を実行する。

解答例
$ echo world >> a.txt
$ sha256sum -c SUMS
a.txt: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

中身が変われば指紋も変わり、照合が FAILED になることが体感できる。

9. コピペ用テンプレート

結論: 計算・一覧保存・照合・配布元1行との突き合わせの定番形をコピペで使える。

チェックサム テンプレ

# 1 ファイルの指紋を計算
sha256sum file

# 複数ファイルをまとめて
sha256sum *.iso

# 一覧を保存
sha256sum *.iso > SHA256SUMS

# 保存した一覧と照合
sha256sum -c SHA256SUMS

# 失敗だけ表示
sha256sum -c --quiet SHA256SUMS

# スクリプト向け(終了コードで判定)
sha256sum -c --status SHA256SUMS && echo OK

# 配布元の値 1 行と照合
echo "<公式ハッシュ>  file.iso" | sha256sum -c -

# より強いハッシュが欲しいとき
sha512sum file

やってはいけないこと

  • 改ざん対策に MD5 / SHA-1 を使う
  • 64 桁を目視で比較する(-c で機械照合する)
  • 区切りのスペースを 1 つにする(必ず 2 つ)

まとめ:次に読む