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