ハッシュ値でファイルの同一性を示す
ハッシュ値とは、ファイルの中身から計算する、短い文字列です。同じ内容なら必ず同じ値になり、1文字でも違えば、まったく違う値になります。
この性質を使うと、証拠のファイルが集めたあとも変わっていないことを、誰でも確かめられます。
このレッスンのゴール
メモ
ファイルが変わっていないことをハッシュ値で示し、メタデータを読むことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ハッシュ値 | ファイルの中身から計算した、短い文字列。指紋のようなもの | |
| SHA-256 | 証拠に使われる、ハッシュ値の計算方法の1つ | sha256sum |
| メタデータ | ファイルについてのデータ。大きさ、時刻、持ち主など | |
| 更新時刻 | ファイルの中身が最後に書き換えられた時刻 | |
| 所有者 | そのファイルを持つアカウント | |
| 改ざん | 中身をこっそり書き換えること |
学生が入力するセルは、このプレビューでは空白です。
ハッシュ値は何を表すのか
文字列を入れると、決まった長さの値が出てくる計算を、ハッシュ関数と呼びます。SHA-256 なら、出る値は、いつも16進数の64文字です。
値から、元の内容を取り出すことはできません。でも、内容が同じかどうかは、値を比べるだけで分かります。
hello のハッシュ値
printf 'hello' | sha256sumここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Hello のハッシュ値
printf 'Hello' | sha256sumここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 1文字違うと全部が変わる
| 入れた文字列 | ハッシュ値の最初の8文字 |
|---|---|
| hello | 2cf24dba |
| Hello | 185f8db3 |
学生が入力するセルは、このプレビューでは空白です。
集めたときの値と、あとの値を比べる
集めたその場で、ハッシュ値を計算して記録します。あとで調べるとき、もう一度計算します。2つが同じなら、その間、変わっていません。
記録した値は、ファイルとは別の場所に保管します。同じ場所だと、一緒に書き換えられるかもしれません。
小さな記録ファイルを作る
printf 'order 100 yen\n' > memo.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
集めたときの値を記録する
sha256sum memo.txt > memo.sha256ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
記録した値と比べる
sha256sum -c memo.sha256ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
こっそり1文字足す
printf 'x' >> memo.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一度比べる
sha256sum -c memo.sha256ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 記録した値と、あとの値
| 時点 | memo.txt の値の最初の8文字 | 結果 |
|---|---|---|
| 集めたとき | 19a0852c | 記録した |
| 比べたとき(変更なし) | 19a0852c | 同じ。変わっていない |
| 1文字足したあと | ea179c30 | 違う。変わった |
学生が入力するセルは、このプレビューでは空白です。
メタデータは、ファイルのまわりの情報
ファイルには、中身のほかに、大きさ、持ち主、権限、時刻の記録がついています。これをメタデータと呼びます。
時刻は3種類あります。更新時刻、アクセス時刻、変更時刻です。変更時刻は、持ち主や権限を変えたときも動きます。
ファイルの3つの時刻
| 名前 | 動くとき | touch で書き換えられるか |
|---|---|---|
| 更新時刻(mtime) | 中身を書き換えたとき | はい |
| アクセス時刻(atime) | 中身を読んだとき | はい |
| 変更時刻(ctime) | 中身、持ち主、権限を変えたとき | いいえ |
学生が入力するセルは、このプレビューでは空白です。
更新時刻を自分で決める
touch -d '2026-03-01 09:30:00 UTC' memo.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
更新時刻を読む
date -u -r memo.txt '+%F %T'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
権限を決める
chmod 640 memo.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
権限を数字で読む
stat -c '%a' memo.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
「更新時刻が古いから、最近は触られていない」と考える人がいます。touch で、時刻は簡単に変えられます。時刻は手がかりで、証明ではありません。同じかどうかは、集めたときに記録したハッシュ値で確かめます。