パスワードのハッシュ化とは?仕組みと復元できない理由

パスワード ハッシュ化とは、パスワードをハッシュ関数と呼ばれる計算式に通し、元に戻せない固定長の文字列(ハッシュ値)へ変換して保存する仕組みです。この一方向変換により、万一データベースが流出しても、そこから元のパスワードを直接読み取ることはできません。本記事では、ハッシュ関数の一方向性、平文で保存してはいけない理由、そしてソルトの役割を、暗号化との違いを含めて分かりやすく解説します。

ハッシュ化とは何か

ハッシュ化とは、任意の長さの入力データを、ハッシュ関数によって決まった長さの文字列へ変換する処理です。同じ入力からは必ず同じハッシュ値が生成され、入力が1文字でも変われば結果はまったく異なるものになります。たとえば代表的な SHA-256 というハッシュ関数は、どんな長さの入力でも 256 ビット、16 進数表記で 64 文字のハッシュ値を出力します。

重要なのは、この変換が一方向(片道)であるという点です。入力からハッシュ値を計算するのは高速ですが、ハッシュ値から元の入力を逆算する現実的な方法は存在しません。この性質が、パスワードを安全に扱う土台になります。

パスワード ハッシュ化とは:なぜ復元できないのか

ハッシュ関数が復元できない理由は、計算の過程で情報が意図的に「潰される」ように設計されているからです。掛け算の答えから元の2つの数を一意に割り出せないのと似て、ハッシュ値だけを見ても、そこへ至る入力は無数に考えられ、特定できません。

  • 一方向性:ハッシュ値から元のパスワードを逆算できない。
  • 衝突耐性:異なる入力が同じハッシュ値になる組み合わせを、意図的に見つけるのが極めて困難。
  • 雪崩効果:入力のわずかな違いが、出力全体を大きく変化させる。

だからこそ、ログイン時はサーバーが入力パスワードを同じ関数でハッシュ化し、保存済みのハッシュ値と照合するだけで本人確認ができます。元のパスワードそのものを保持する必要がないのです。

平文で保存してはいけない理由

パスワードをそのままの文字列(平文)で保存すると、データベースが漏えいした瞬間に全ユーザーのパスワードが読み取られてしまいます。多くの人が同じパスワードを複数のサービスで使い回すため、被害は流出したサイトだけにとどまりません。

ハッシュ化して保存していれば、攻撃者が手に入れるのはハッシュ値の羅列だけです。そこから元のパスワードを直接読み出すことはできないため、被害を大幅に抑えられます。運営側も、そもそもユーザーの生のパスワードを知らずに認証を成立させられる点が大きな利点です。強度の高いパスワードを使うことも同じくらい重要で、パスワード生成ツールでランダムな文字列を作れば、推測やリスト攻撃への耐性が高まります。

ソルトの役割

ハッシュ化には弱点もあります。同じパスワードは同じハッシュ値になるため、あらかじめ大量のハッシュを計算した辞書(レインボーテーブル)と照合されると、単純なパスワードは見破られてしまいます。これを防ぐのがソルトです。

  • ソルトとは:ユーザーごとに用意するランダムな文字列で、パスワードに付け足してからハッシュ化する。
  • 効果:同じパスワードでもユーザーごとに異なるハッシュ値になり、使い回しの事前計算による攻撃が無効化される。
  • 補足:計算を意図的に遅くする bcrypt や Argon2 といった専用アルゴリズムを併用すると、総当たり攻撃への耐性がさらに高まる。

ソルトは秘密にする必要はなく、ハッシュ値と一緒に保存して構いません。狙いは秘匿ではなく、攻撃者に一人ひとり個別の計算を強いることにあります。パスワードの作り方そのものについてはパスワード生成アルゴリズムの仕組みも参考になります。

ハッシュ化と暗号化の違い

ハッシュ化と暗号化はどちらもデータを変換しますが、目的が根本的に異なります。暗号化は、鍵を使って元のデータへ戻せることを前提とした技術です。一方でハッシュ化は、戻せないことをむしろ利点とします。

  • 暗号化:双方向。正しい鍵があれば復号して元データを取り出せる。データの機密を保ちつつ後で読み返す用途に使う。
  • ハッシュ化:一方向。復元は想定されず、照合や改ざん検知に使う。パスワード保存はこちらが適切。

パスワードを暗号化で保存すると、鍵が盗まれた時点で全パスワードが復号されてしまいます。復元できないハッシュ化のほうが、保存された情報から漏えい被害を広げにくいのです。パスワードの使い回しがなぜ危険かはパスワード使い回しのリスクで詳しく解説しています。

よくある質問

ハッシュ化したパスワードは元に戻せますか?

いいえ。ハッシュ関数は一方向に設計されており、ハッシュ値から元のパスワードを逆算する現実的な方法はありません。認証はログイン時に入力を同じ方法でハッシュ化し、保存済みの値と一致するか照合して行います。

ソルトは秘密にしておく必要がありますか?

いいえ。ソルトはハッシュ値と一緒に保存して問題ありません。目的はソルトを隠すことではなく、同じパスワードでもユーザーごとに異なるハッシュ値を作り、事前計算による攻撃を無効化することにあります。

ハッシュ化していれば単純なパスワードでも安全ですか?

いいえ。短く単純なパスワードは総当たりや辞書攻撃で破られやすく、ハッシュ化だけでは守り切れません。ソルトや遅いアルゴリズムに加え、長くランダムなパスワードを使うことが安全性を大きく高めます。

執筆者について

山本 由紀 — セキュリティ編集者

パスワード生成ツールを管理し、パスワード安全性のガイドを最新の推奨事項に沿って確認しています。

editor@xn--zck6aw5jtct103b141a.com

ツールを使う すべての記事