パスワード ハッシュ わかりやすく
ミキサーに果物を入れて回すと、ジュースができます。ジュースだけを見て、どの果物がどれだけ入っていたかを正確に元に戻すことはできません。セキュリティのハッシュも似ています。ある値を入れると短い指紋が出てきますが、その指紋から元の値を逆に計算することはできません。だからサービスは、パスワードをそのまま保存せず、この指紋だけを保存します。
一方向にしか進まない
どんな値を入れても、決まった長さの短い指紋を返す計算があります。これをセキュリティのハッシュと呼びます。同じ値を入れればいつも同じ指紋が出てきて、一文字変えただけで指紋はまったく別物になります。
いちばん大事な性質は向きです。入力から指紋を作るのはかんたんですが、指紋から元の入力を逆に計算する方法はありません。果物はジュースになっても、ジュースは果物に戻らないのと同じです。だから一方向関数と呼ばれます。
「指紋を作る」ボタンで入力を指紋に変えてみましょう。そのあと「戻す」を押すと、道はふさがっています。
前へ進む道はすぐに開きましたが、後ろへ戻る道はふさがっていました。このふさがりこそが、セキュリティのハッシュの要です。指紋だけでは、元の値をすぐには割り出せないからです。
この性質がいちばんよく使われるのがパスワードです。パスワードをそのまま保存しておくと、保存先をのぞいた人にすぐ知られてしまいます。そこで別のやり方をとります。
パスワードの代わりに指紋を保存する
パスワードを文字どおりそのまま保存することを、平文保存といいます。こうしておくと、保存先が破られたり、誰かがのぞいたりしただけで、すべての利用者のパスワードが知られてしまいます。多くの人が同じパスワードをあちこちで使っているので、被害はほかのサービスにまで広がります。
だからパスワードはハッシュに通し、出てきた指紋だけを保存します。保存先には、元に戻せない指紋が並ぶだけになります。
「平文保存」と「指紋保存」のボタンを押して比べてみましょう。平文保存ではパスワードがそのまま見え、指紋保存では元に戻せない指紋だけが残ります。
平文で保存したほうはパスワードが丸見えで、指紋で保存したほうは読み取れない指紋だけが残りました。ただし、指紋があるから完全に安心というわけではありません。攻撃者は指紋を逆に計算できなくても、よくあるパスワードを一つずつハッシュに通して、同じ指紋が出るかどうか照らし合わせることはできるからです。
そのため、パスワード用のハッシュはわざと計算を遅くして、こうした当てはめを難しくしています。では、パスワードを保存しないなら、ログインのときに正しいかどうかをどう確かめるのでしょうか。
入力を指紋に変えて確かめる
同じ値を入れればいつも同じ指紋が出る、という性質を確認に使います。ログインのときに利用者がパスワードを入力すると、サーバーはその入力をもう一度ハッシュに通して新しい指紋を作り、保存しておいた指紋と比べます。
二つが同じなら同じパスワードが入力されたので通し、違えば止めます。元のパスワードを取り出して見なくても、指紋どうしを比べるだけで確かめられるのです。
入力を一つ選んで「確認」を押してみましょう。入力の指紋が保存された指紋と同じなら通過し、違えば止められます。
正しいパスワードを入れたときだけ、指紋が一致して通過しました。数字が一つ違うだけのパスワードも、まったく別の指紋になって止められました。保存は指紋だけ、確認は指紋どうしの比較。こうして元の値がなくても正誤を見分けられます。
ハッシュはパスワード以外にも使われます。ダウンロードしたファイルの指紋を公開されている指紋と比べれば、届くあいだにファイルが変えられていないかを確かめられます。前のレッスンで見た完全性を守る手段です。
データ単元のハッシュとは目的が違う
ハッシュということばは、データの単元にも出てきました。そこでは値をマスの番号に変えて、ほしい資料をすばやく探すのに使いました。速く、かたよりなく置き場所を決めるのが目的で、たまに二つの値が同じマスに入っても大きな問題にはなりませんでした。
セキュリティのハッシュは、形は似ていても目的が違います。指紋から元の値へ戻れないことに加えて、同じ指紋になる別々の二つの入力を見つけることも、事実上できないようにしなければなりません。
両側を押して、二つのハッシュの目的を比べてみましょう。データ単元のハッシュはすばやく探すため、セキュリティのハッシュは元に戻せなくするためのものです。
同じハッシュという名前でも、データの単元ではすばやく探すために、セキュリティでは元に戻せなくするために使います。目的が、その道具に必要な性質を決めるのです。
このように、同じ名前の道具でも、どこで使うかによって大事な性質が変わります。セキュリティでは、元に戻せないことがいちばん大切な性質です。では、最初から最後までまとめてみましょう。
まとめ
まとめるとこうです。セキュリティのハッシュは、入力を一方向の指紋に変え、指紋から入力へは戻れません。だからパスワードそのものではなく、指紋だけを保存します。ログインのときは入力をもう一度指紋に変えて、保存された指紋と比べ、同じなら通します。
これは、すばやく探すために使うデータ単元のハッシュとは違い、元に戻せなくするために使うハッシュです。
要点を順に押して振り返りましょう。(一方向の指紋 → 指紋だけを保存 → 入力の指紋で確認 → データ単元のハッシュとは目的が違う)
これで、パスワードをそのまま置いておかなくても守れる方法がわかりました。元に戻せない指紋一つで、保存と確認の両方が安全になります。誰も元の値を持っていないので、もれる秘密も少なくなります。
ただし、まだ弱点が残っています。同じパスワードはいつも同じ指紋になるので、二人が同じパスワードを使えば指紋も同じになり、よくあるパスワードの指紋の一覧を前もって作っておくこともできます。この弱点をふさぐソルトを、次のレッスンで扱います。