安全に作られたサービスは、パスワードを そのままの形では保存しません。万一データベースが漏えいしても、元のパスワードが分からないようにするためです。
その方法が、ハッシュ 化です。パスワードを、元に戻せない値(ハッシュ値)に変換して保管します。
flowchart LR P["入力パスワード"] --> S["ソルトを付与"] --> H["ハッシュ化"] --> DB[(ハッシュ値を保存)]
ログイン時は、入力されたパスワードを同じ手順でハッシュ化し、保存済みの値と一致するかを比べます。元のパスワードは、サーバーですら保持しません。
さらに安全性を高めるのが ソルト(salt) です。利用者ごとに違うランダムな文字列を、パスワードに混ぜてからハッシュ化します。
- 同じパスワードでも別の値になる … 使い回しを見抜けなくする。
- 事前計算による割り出し(レインボーテーブル)を防ぐ。
加えて、あえて計算に時間のかかる専用のハッシュ方式(bcrypt、Argon2 など)を使い、総当たり攻撃を現実的でなくします。「そのまま保存しない・ソルトを混ぜる・専用方式を使う」——これがパスワード保護の基本三点セットです。