わかりやすく ソルト パスワード とは
前のレッスンで、パスワードはそのまま保存せず、ハッシュの指紋に変えて保存すると学びました。では、二人がたまたま同じパスワードを使っていたらどうなるでしょうか。同じ入力は同じ指紋になるので、保存された一覧に同じ値が並びます。パスワードを知らなくても、二人のパスワードが同じだということはわかってしまいます。このすき間をふさぐために、人ごとに違う値をひとつまみ混ぜます。これをソルトと呼びます。
同じパスワードは同じハッシュになる
ハッシュは、同じ入力にいつも同じ結果を返します。だからこそ、ログインのときに入力の指紋を保存された指紋と照らし合わせられました。けれども、この性質には影があります。
二人が同じパスワードを使えば、二人のハッシュも同じになります。保存されたハッシュの一覧に同じ値が並んでいれば、パスワードそのものはわからなくても、二人が同じだということがもれてしまいます。一人のパスワードが知られれば、同じハッシュを持つ人のパスワードもいっしょに知られます。
二人のパスワードを、同じにも違うにも選んでみましょう。パスワードが同じなら、保存されたハッシュも同じ値で並んで見えます。
同じパスワードを選ぶと、二つのハッシュはまったく同じでした。ハッシュを見るだけで、同じだとすぐにわかります。ハッシュは逆に計算できないと学びましたが、同じ値が同じハッシュになるという点は変わりません。
では、誰かがよくあるパスワードを前もってハッシュして、一覧に書きとめておいたらどうなるでしょうか。
前もって作った表はなぜ危ないのか
人がよく使うパスワードは、思ったより種類が少ないものです。だから、そうしたパスワードとそれぞれのハッシュを一行ずつ書いた表を、前もって作っておけます。こうした表があれば、破られた保存先のハッシュを表で探して、元のパスワードをすぐに割り出せます。
ハッシュを逆に解いているのではなく、前もって書いておいた答えと照らし合わせているのです。たくさんのハッシュを一つの表でまとめて照合できる点が、とくに危険です。こうした表を効率よく圧縮したものを、レインボーテーブルと呼びます。
保存されたハッシュを一つずつ押してみましょう。前もって書いた表に同じハッシュがあればパスワードがわかってしまい、表になければ推測は止められます。
表のハッシュと同じものは、となりの列のパスワードがそのまま見えてしまい、表にないハッシュは推測が止められました。危険の根っこは、同じパスワードがいつも同じハッシュになるという点にあります。
そうすると、防ぐ道も見えてきます。同じパスワードでも人ごとにハッシュが変わるようにすれば、前もって作った表一つでは、もう照合できません。その方法がソルトです。
パスワードにソルトを加える
ソルトは、人ごとにランダムに決める短い値です。登録のときに新しく作り、パスワードをそのままハッシュする代わりに、その人のソルトをつけて、合わせたものをハッシュします。
ソルトは隠すべき秘密ではないので、ハッシュのとなりにいっしょに保存しておきます。ログインのときに同じソルトをもう一度つけないと、同じ指紋にならないからです。ソルトの仕事は一つ、人ごとにハッシュを違うものにすることです。
「ソルトを加える」ボタンを押してみましょう。二人のパスワードは同じですが、ソルトが違うので、合わせた入力もハッシュも違ってきます。
ソルトを加えると、ハッシュに入る入力が変わりました。同じパスワードでも、つけたソルトが違えば材料が違い、ハッシュは入力が少し変わるだけで結果がまったく変わります。だから、ソルトが違えばハッシュも違うしかありません。
では、同じパスワードを使う二人の保存されたハッシュがどう見えるかを、ソルトを消したりつけたりして比べてみましょう。
同じパスワードでも違うハッシュになる
ソルトがないときは、同じパスワード二つのハッシュは同じでした。ソルトをつけると、二人のパスワードが同じでも、保存されたハッシュは互いに違います。ハッシュの一覧を見ても、同じパスワードを使う人を見分けられなくなります。
前もって作った表も力を失います。その表はソルトのないパスワードから作ったものなので、ソルトの混ざったハッシュとは合いません。表を使うには、ソルトごと、つまり人ごとに表を作り直さなければならないので、事実上役に立たなくなります。
ソルトを消したりつけたりして比べてみましょう。消すと同じパスワードは同じハッシュになり、つけると同じパスワードでもハッシュが変わって、前もって作った表が合わなくなります。
ソルトをつけると、同じだった二つのハッシュが別々の値に分かれ、前もって作った表ももう合わなくなりました。小さなひとつまみが、二つのことをいっぺんに防いだわけです。保存されたハッシュから同じパスワードを見つけることと、表でよくあるパスワードを逆引きすることです。
ただし、ソルトですべてが防げるわけではありません。一人にねらいを定め、その人のソルトをつけたよくあるパスワードを一つずつ試す攻撃は、まだできます。だからソルトは、わざと遅くしたハッシュや、推測されにくい長いパスワードといっしょに使う必要があります。
まとめ
まとめるとこうです。同じパスワードは同じハッシュになるので、保存されたハッシュから同じパスワードを見つけられ、前もって作った表でよくあるパスワードを逆引きできます。これを防ぐには、人ごとに違うランダムなソルトをパスワードにつけてからハッシュします。
ソルトは秘密ではなく、人ごとに違ってさえいればよいのです。ソルトを加えれば同じパスワードでもハッシュが変わり、前もって作った表は力を失います。
要点を順に押して振り返りましょう。(同じパスワードは同じハッシュ → 前もって作った表の危険 → 人ごとにソルトを加える → 同じパスワードでも違うハッシュ)
これで、同じパスワードがなぜ落とし穴になるのか、ひとつまみのソルトがその穴をどうふさぐのかがわかりました。新しい秘密を隠さなくても、人ごとに値を変えるだけで守りが固くなるのは、おもしろいところです。
ここまでは、パスワードを安全に保存する方法を見てきました。でも、パスワード一つで自分を証明するので十分でしょうか。パスワード以外にも本人であることを示すいろいろな方法を、次のレッスンの認証で扱います。パスワードは知っているものにすぎず、持っているものや自分自身の特徴も証明に使われます。