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

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

この記事でできるようになること

  • `sha256sum` でファイルの指紋を計算できる
  • `-c` で記録した指紋と現在のファイルを照合できる
  • ハッシュを暗号化やエンコードと区別して説明できる

前提知識(先に読むと理解しやすい記事)

この記事で学べること

  • チェックサム(ハッシュ) が何のためにあるのかがわかります
  • sha256sumファイルの指紋を計算 できます
  • -c を使って 壊れていないか・すり替えられていないか を照合できます
  • ハッシュ・暗号化・エンコード の違いを言い分けられます

言葉の整理(先に取りちがえを防ぎます)

  • チェックサム / ハッシュ値 / 指紋:ほぼ同じものを指す呼び方です。この記事では「指紋」を説明用の言い換えとして使います。
  • ハッシュ:中身から短い値を作ることです。元のファイルには戻せません。「同じか違うか」を確かめるための道具です。
  • 暗号化:鍵を持つ人だけが元に戻せるようにすることです。中身を隠すのが目的です。ハッシュとは目的が違います。
  • エンコード:書き方を変えるだけの変換です。鍵なしで誰でも戻せます。base64 がこれにあたります。

ハッシュは 戻せません。暗号化は 鍵があれば戻せます。エンコードは 誰でも戻せます。この 3 つを混ぜないでください。

結論(先に覚える型)

  • とりあえず指紋を見たい → 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

区切りは自分で打ち直さない

「ハッシュ」と「ファイル名」の間は、sha256sum の出力どおり 半角スペース 2 つ にします。スペースを 3 つ以上にすると、余分な空白までファイル名の一部として扱われ、No such file or directory になります。配布元の値をコピーするときは、余計な空白を足さないでください。

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

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

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

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

--status は結果を画面に出しません。終了コード(成功 0 / 失敗 1)だけで判断します。終了コードは直前のコマンドが成功したかを表す数字で、echo $? で確認できます。シェルスクリプトでの自動チェックに向きます。

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

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

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

2 つの目的

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

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

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

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

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

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

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

リナ: 先輩、公式サイトの値とダウンロードしたファイルの指紋を、画面に並べて見比べました。一致していたのでインストールしました。
ライニー先輩: 64 桁を目で比べたのかな。途中の 1 文字が違っても気づきにくいよ。
リナ: えっ。全部そろっていると思ったのですが…。真ん中あたりは正直、流し読みでした。
ライニー先輩: 人間の目はそういうふうにできている。だから -c で機械に照合させる。これなら 1 文字の違いも必ず見つかるよ。
リナ: なるほど。見比べるのではなく、コマンドに判定させるんですね。
# NG: 目で見比べる(見落とす)
# OK: 一覧にして -c で照合
$ sha256sum -c SHA256SUMS

7-2. 区切りに余分な空白が入っている

一覧ファイルの区切りに 空白を 3 つ以上 入れると、こうなります。

sha256sum: ' ubuntu.iso': No such file or directory
 ubuntu.iso: FAILED open or read
sha256sum: WARNING: 1 listed file could not be read

FAILED ではなく FAILED open or read が出たときは、中身の不一致ではありません。「ファイル名が読めていない」という意味です。sha256sum file > SHA256SUMS で作った一覧をそのまま使えば、この形にはなりません。

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

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

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

末尾の - は「ファイルではなく、パイプで流れてきた内容を読む」という意味です。sha256sum -c SHA256SUMS のファイル名の位置に - を置く、と覚えてください。

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

ファイル名が違うだけで 中身が同じ なら、ハッシュは一致します。ハッシュは 中身だけ を見ます。ファイル名や更新日時は見ません。

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

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

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

練習用のからっぽのディレクトリを作り、その中で試します。こうすれば、もとからあるファイルを上書きしません。

# 練習用ディレクトリを準備して移動する
$ mkdir -p ~/checksum-practice && cd ~/checksum-practice

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

ヒント 1(方向づけ)を見る

指紋を計算するコマンドに、ファイル名を渡すだけです。オプションはいりません。

ヒント 2(コマンド名)を見る

sha256sum を使います。

答えを見る
$ echo hello > a.txt
$ sha256sum a.txt
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03  a.txt

64 桁の指紋とファイル名が並びます。間はスペース 2 つです。

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

ヒント 1(方向づけ)を見る

計算した結果をファイルに書き出します。そのあと、書き出した一覧を読ませて確かめます。

ヒント 2(コマンド名)を見る

使うコマンドは sha256sum です。保存にはリダイレクトの >、照合には -c を使います。

答えを見る
$ sha256sum a.txt > SUMS
$ sha256sum -c SUMS
a.txt: OK

OK は「保存した指紋と今の中身が同じ」という意味です。

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

ヒント 1(方向づけ)を見る

ファイルに 1 行だけ追記します。そのあと、課題 2 と同じ照合をもう一度行います。

ヒント 2(コマンド名)を見る

追記には >> を使います(> は上書きです)。照合は課題 2 と同じコマンドです。

答えを見る
$ 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 で機械照合する)
  • 区切りを手で打ち直す(sha256sum の出力をそのままコピーする)

振り返り

結論: 指紋は元に戻せない値であり、照合は目ではなく -c に任せる。改ざん対策は SHA-256 を選ぶ。

リナ: 整理します。ハッシュは中身から作る指紋で、そこから元のファイルには戻せないんですね。
ライニー先輩: その通り。戻せないから隠す道具にはならない。「同じか違うか」を確かめる道具だよ。
リナ: そして照合は目で見比べない。-c に判定させる。私の失敗はそこでした。
ライニー先輩: よく言語化できたね。あとは改ざん対策に SHA-256 を選ぶ。それだけ持ち帰れば十分だよ。

今日の 3 行まとめ

結論: 指紋は sha256sum で計算し、目ではなく -c で照合し、改ざん対策には SHA-256 を選ぶ。

  1. sha256sum file でファイルの指紋を計算できます。ハッシュは元に戻せません
  2. 照合は目で見比べず、sha256sum -c 一覧ファイル に判定させます
  3. 改ざん対策には SHA-256 以上を使います。MD5 / SHA-1 は偶発的な破損検出だけに使います

まとめ:次に読む

この記事を共有

次の一手