ダウンロードしたファイルは本物か
ハッシュ値とは、ファイルの中身から計算する、短い文字列の指紋のようなものです。中身が1文字でも変われば、ハッシュ値はまったく違うものになります。
そのため、ダウンロードしたファイルが配布元のものと同じか、途中で書き換えられていないかを、数秒で確かめられます。このレッスンでは、実際にその確かめ方を身につけます。
このレッスンのゴール
メモ
ハッシュ値を使って、データが変わっていないかを確かめることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ハッシュ関数 | どんな長さのデータからも、決まった長さの値を作る計算 | |
| ハッシュ値 | ハッシュ関数が出した値。ダイジェストとも呼ぶ | 2cf24dba5fb0a30e... |
| チェックサム | データが変わっていないかを確かめるための値 | |
| 整合性 | データが途中で変えられていない状態 | |
| 雪崩効果 | 入力を少し変えると、出力が大きく変わる性質 | |
| 一方向 | 結果から元の入力を逆算できないこと |
学生が入力するセルは、このプレビューでは空白です。
ハッシュ関数は何をする計算か
ハッシュ関数は、どんな長さのデータを入れても、決まった長さの値を返します。SHA-256 という関数なら、いつも256ビット、つまり16進数の64文字です。
同じ入力からは、いつも同じ値ができます。この性質があるので、2つのファイルを見比べなくても、値だけを比べれば足ります。
"hello" の SHA-256 を求める
printf 'hello' | sha256sumここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の読み方
先ほどの Run は、64文字のハッシュ値のあとに、空白2つとハイフンを表示します。ハイフンは「標準入力から読んだ」という意味です。
"hello" は5文字ですが、5万文字の文章でも、出る値は同じ64文字です。長さは変わりません。
空の入力でも値は出る
printf '' | sha256sumここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1文字変えるだけで、値は別物になる
"hello" の最後を "hellp" に変えると、ハッシュ値はまったく違うものになります。似た入力だから似た値になる、ということはありません。これが雪崩効果です。
だから、ほんの小さな書き換えでも、値を比べればすぐ分かります。
1文字だけ変えて比べる
printf 'hellp' | sha256sumここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 先頭16文字を並べる
| 入力 | 1文字の違い | SHA-256 の先頭16文字 |
|---|---|---|
| hello | 基準 | 2cf24dba5fb0a30e |
| hellp | 最後の o が p | fdd7585e08c4e2af |
| (空) | 0文字 | e3b0c44298fc1c14 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
「ハッシュは暗号化の一種で、あとで元に戻せる」と考える人が多くいます。ハッシュは一方向の計算で、値から元のデータは取り出せません。元に戻したいときは、鍵を使う暗号化を選びましょう。
チェックサムで、ファイルが同じか確かめる
配布元はファイルと一緒に、そのハッシュ値の一覧を公開します。受け取った側は自分で計算し、一覧と見比べます。1文字でも違えば、壊れたか書き換えられたかのどちらかです。
sha256sum -c は、この見比べを全部やってくれます。次の5つを順に実行しましょう。
練習用のフォルダを作る
mkdir -p cryptolabここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ファイルを1つ作る
printf 'hello' > cryptolab/a.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ハッシュ値の一覧を保存する
sha256sum cryptolab/a.txt > cryptolab/list.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
一覧と見比べる
sha256sum -c cryptolab/list.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ファイルを1文字だけ書き換える
printf 'hellp' > cryptolab/a.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一度見比べる
sha256sum -c cryptolab/list.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見比べた結果の読み方
1回目の見比べは cryptolab/a.txt: OK と表示します。書き換えたあとの2回目は cryptolab/a.txt: FAILED を表示し、続けて、1つ合わなかったという警告が出ます。
注意したいのは、一覧そのものが書き換えられたら、この確認は意味を失うことです。一覧は、安全な場所から受け取りましょう。
Python でハッシュ値を作る
import hashlib
# 3つの文字列の SHA-256 を、先頭の16文字だけ見ます。
for text in ["hello", "hellp", ""]:
digest = hashlib.sha256(text.encode()).hexdigest()
print(len(digest), digest[:16])
# "hello" を自分の名前に変えて、もう一度実行しましょう。