Lから始まるLinux

2章48話
同一ファイルへの入出力
2章49話 ハッシュ(基本)
もくじ
2章50話
ハッシュ(使い方)
ハッシュ(基本)
若木 しげる
今回は 「ハッシュ(hash)」 学んでみよう!
若木 みどり
それはどういう ものなのかな?
若木 しげる
ハッシュは 元となるデータから 決められた計算で 求められた値の ことなんだ
若木 しげる
ハッシュで 生成される 値の長さは 多くの場合で 比較的短めの 固定長だよ
若木 みどり
へぇ… 定義自体は 簡単そうだね
若木 しげる
ハッシュの値は 様々な場面で 使われているよ
若木 しげる
そのため色々な 呼び名があるんだ 「ハッシュ(hash)」 「ハッシュ値(hash value)」 「チェックサム(checksum)」 「指紋(fingerprint)」 全てハッシュから生成された 値のことを指す呼び名だよ
若木 みどり
ハッシュには 色々な用途が あるんだね
若木 みどり
ハッシュがあると どんなことが できるんだろう?
若木 しげる
それを知るには ハッシュの性質を 理解する必要があるよ
同じデータからは同じハッシュ値
若木 しげる
最も重要な性質は 「同じデータからは 同じハッシュ値が 生成される」だよ!
若木 みどり
同じデータから 同じ手順で計算すると 同じ値が出てくる…
若木 みどり
言葉にしてみると すごく当たり前な 気がするね!
若木 しげる
そのため データのハッシュ値を 事前に記録しておけば ハッシュ値の変化から データの変化を 検出できるんだ
若木 みどり
ハッシュ値を比べるだけで データ全部を比較しなくても データの変化がわかるんだね!
一方向性
若木 しげる
次の性質は「一方向性(one-way)」だよ データからハッシュ値を計算できるけど ハッシュ値から元データを作り出せない という意味なんだ
若木 みどり
生卵をゆで卵にできるけど ゆで卵を生卵にはできない のような感じね!
若木 しげる
パスワードを扱う 多くのシステムでは パスワードをそのまま保存せず パスワードのハッシュ値を 保存しているよ
若木 みどり
パスワードの保管は ちゃんと本来の値のまま 保存するのが良い気がするけど… どうしてひと手間かけて ハッシュ値にしてから 保存するのかな?
若木 しげる
保管されているデータが 盗まれた場合を考えてみよう 生のままのパスワードが 保存されていたらと 考えてみたらどうだろう?
若木 みどり(驚き)
ゾッとするね! パスワードが 全部ばれちゃう!
若木 しげる
パスワードそのままではなく パスワードのハッシュ値が 保存されていた場合 仮に盗まれたとしても パスワードを復元したりして 知ることはできないんだ
若木 みどり
なるほど… 情報漏洩の防御に なるんだね!
衝突
若木 しげる
最後に「衝突(collision)」だよ 入力するデータは無限にあるけど 出力されるハッシュ値の範囲は 基本的に有限なんだ
若木 みどり
あれ? それだと全く別のデータだけど 同じハッシュ値を生成するデータが 複数存在するってことだよね?
若木 しげる
そういうことだね この「違うデータが 同じハッシュ値を生成する」 現象を衝突と呼ぶよ
若木 みどり(驚き)
えぇ… これってとても まずいんじゃ ないかな?
若木 みどり
データに変化があっても ハッシュ値が偶然同じで 変化を検出できなかったり 違うパスワードでも ハッシュ値が同じだったら そのパスワードが 通っちゃう可能性が あるんだよね?
若木 しげる
うん まさに心配の通りなんだ
若木 しげる
なのでハッシュでは 出力される値の範囲が 十分に大きくなっていて ランダムな二つのデータが 衝突する可能性は 天文学的に十分低く 実用の範囲ではまず 衝突が起きないものに なっているんだ
若木 しげる
なので通常の用途では 衝突の心配をしなくていいけど 衝突という性質があることは ちゃんと理解しておこう!
まとめ
若木 みどり
今回はハッシュを学んだよ! データから計算で求められる値で 以下のような性質があるんだ!
  • 同じデータからは同じハッシュ値が生成される
  • 一方向性
  • 衝突
若木 しげる
次回は ハッシュをどう使うか 実践してみよう!