クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

ハッシュ値でデータの改ざんを調べる

このレッスンのあとで: ハッシュ値を使って、データが変わっていないかを確かめることができる。

50分のレッスンコマンド9件毎日使う Linux コマンドのラボ:エンジニアが暗記している30のコマンド

ダウンロードしたファイルは本物か

ハッシュ値とは、ファイルの中身から計算する、短い文字列の指紋のようなものです。中身が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 が pfdd7585e08c4e2af
(空)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 でハッシュ値を作る

コード: python
import hashlib

# 3つの文字列の SHA-256 を、先頭の16文字だけ見ます。
for text in ["hello", "hellp", ""]:
    digest = hashlib.sha256(text.encode()).hexdigest()
    print(len(digest), digest[:16])

# "hello" を自分の名前に変えて、もう一度実行しましょう。

このラボとソースについて: 毎日使う Linux コマンドのラボ:エンジニアが暗記している30のコマンド

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。