パスワードはどう守られているのか

概要 — まず全体をつかむ

会員登録したサイトが事件で「パスワード流出」と報道されても、被害が出る人と出ない人がいます。その分かれ目は、サイトの金庫の作り方と、あなたのパスワードの使い方にあります。ログインの1〜2秒の裏側は、かならずこの順番で進みます:

  1. 届ける — 入力したパスワードが、鍵付きの道でサイトの受付へ届く
  2. すりつぶす — 受付がパスワードを「元に戻せない形」に変える
  3. 照合する — 金庫にある「すりつぶした結果」と見比べる
  4. 会員証をもらう — 一致したら、しばらく有効な会員証で通れるようになる
アニメーション『ログインの裏側』を開く
あなたサイトの受付金庫(データベース)
  • あなたパスワードを入力してログインしたい人
  • サイトの受付入力を受け取って、本人かどうかを確かめる係
  • 金庫(データベース)会員情報の保管庫。パスワードは「すりつぶした形」でしか置いていない
「▶ 再生」で通しで見るか、「次へ」で1手ずつ進めてください。
0 / 6

ログインの仕組み全体(本人確認・トークン・SNSログイン・パスワードレス・MFA)は 認証(ログインシステム) を参照。ここではパスワードそのものの守られ方に絞ります。

詳細 — 1段階ずつ追う

① 届ける

🎬 アニメーション『ログインの裏側』の のところです!

ログインボタンを押すと、IDとパスワードはインターネットを旅してサイトの受付へ向かいます。ここで大事なのは、鍵付きの道(アドレスバーの鍵マーク、httpsって言います)を通ることです。

  1. あなたがログインボタンを押す
  2. パスワードは暗号化された通信路に乗って受付へ向かう
  3. 途中の機械(Wi-Fi・ルーター・通信網)は通過するだけ。盗み見されても中身は読めない

⚠️ イレギュラー(うまくいかないとき):

  • 鍵マークのないサイト — 道が暗号化されていないので、途中でパスワードを盗み見される可能性がある。ログインしてはいけない
  • 偽物のサイト(フィッシング) — 道がいくら安全でも、届け先が泥棒なら意味がない。本物そっくりの偽サイトに自分から入力してしまう被害が、実はいちばん多い
この部分をもっと深く(中級

🎬 アニメーション『ログインの裏側』の のところです!

入力したパスワードは、次の形でサイトへ届きます:

  1. フォームの内容は HTTPSのPOSTリクエスト※1 のボディに載る(URLには載せない——履歴やログに残るため)
  2. 通信全体が TLS※2 で暗号化されるので、パスワード自体はこの区間では生のまま
  3. つまり「経路の守りはTLS任せ、保存の守りはハッシュ任せ」という分業になっている

登場人物メモ(※の説明):

  • ※1 POSTリクエスト — 送信内容を本文(ボディ)に載せるHTTPの依頼形式。URLに載るGETと違い、記録に残りにくい
  • ※2 TLS — 通信の暗号化層。『URLを打ってから表示されるまで』の②で出てきた、あの鍵マークの正体

⚠️ イレギュラー(うまくいかないとき):

  • HTTPのままのサイト — 経路の守りがないので、パスワードが平文で流れる。ブラウザが「保護されていない通信」と警告するのはこれ
  • フィッシング — 経路も保存も完璧でも、届け先が偽物なら全て無意味。技術の外側にある最大の穴

② すりつぶす

🎬 アニメーション『ログインの裏側』の のところです!

受付は届いたパスワードを、そのまま金庫にしまいません。まずすりつぶします(ハッシュ化って言います)。

  1. パスワード「sakura2024」を専用のミキサーにかける
  2. 出てくるのは「a91bc0...」のようなぐちゃぐちゃの文字列
  3. このミキサーは一方通行で、結果から元のパスワードには戻せない
  4. ただし同じパスワードを入れれば、必ず同じ結果が出てくる

「戻せないのに、同じ入力なら同じ結果」——この不思議な性質のおかげで、生のパスワードをどこにも置かずに本人確認ができます。

⚠️ イレギュラー(ここが甘いサイトだと):

  • 生のまま保存しているサイト — 金庫が破られた瞬間、全員のパスワードがそのまま流出する。「流出したけど被害が出ない」と「即・全滅」の分かれ目はここ
  • 「パスワードを忘れた」で元のパスワードがメールで届くサイト — 戻せない形で保存していれば、元のパスワードを送ることは不可能なはず。届いたら、そのサイトは生のまま保存している危険信号
この部分をもっと深く(中級

🎬 アニメーション『ログインの裏側』の のところです!

「すりつぶし」の正式名は暗号学的ハッシュ関数です。ただし、どのハッシュ関数でもいいわけではありません:

  1. 届いたパスワードに、まずソルト※1 という利用者ごとのランダムな値を混ぜる
  2. 混ぜたものをパスワード専用のハッシュ関数※2(bcrypt / scrypt / Argon2)にかける
  3. 出てきたハッシュ値とソルトをセットでDBに保存する(ソルトは隠さなくてよい)

なぜ普通のハッシュ(SHA-256など)ではだめなのか——速すぎるからです。速いハッシュはGPUで秒間数十億回試せます。パスワード用の関数は、わざと遅く設計されていて(さらに scrypt / Argon2 はメモリも大量に要求する=メモリハード※3)、総当たりの効率を殺します。

登場人物メモ(※の説明):

  • ※1 ソルト — 利用者ごとに違うランダム値。同じパスワードでも違うハッシュになるので、「よくあるパスワード→ハッシュ」の事前計算表(レインボーテーブル)が無力化する
  • ※2 bcrypt / scrypt / Argon2 — パスワード保存専用のハッシュ関数ファミリー。計算コストをパラメータで引き上げられる。このアプリも scrypt を使っている
  • ※3 メモリハード — 計算に大量のメモリを要求する性質。GPUの並列攻撃はメモリがボトルネックになり失速する(scrypt/Argon2が該当。bcryptはメモリハードではなくCPUコスト型)

⚠️ イレギュラー(ここが甘いと事故になる):

  • ソルトなしの高速ハッシュ(MD5等)で保存 — 過去の大規模流出事件の定番パターン。レインボーテーブルで一瞬で大半が割れる
  • 「パスワードを忘れた」で元のパスワードが届く — ハッシュ保存ならあり得ない挙動。平文保存の動かぬ証拠

③ 照合する

🎬 アニメーション『ログインの裏側』の ④〜⑤ のところです!

受付は、すりつぶした結果を金庫のものと見比べます。

  1. 受付「この、すりつぶした結果、登録ある?」
  2. 金庫が登録済みの結果と見比べる(生のパスワード同士を比べているのではない)
  3. 一致すれば本人。不一致なら「IDかパスワードが違います

失敗したときに「どちらが違うか」を教えてくれないのは、不親切なのではなくわざとです。「このIDは存在します」と教えるだけで、攻撃者はそのIDを狙い撃ちできるようになるからです。

⚠️ イレギュラー(攻撃されるとき):

  • 総当たり — 機械で何万回も試される。だから多くのサイトは「5回失敗したらしばらくロック」する
  • パスワードリスト攻撃 — 別のサイトから漏れたID・パスワードの一覧を、片っ端から試される。使い回しているパスワードだけが破られる。これが「使い回しが一番危険」と言われる理由
この部分をもっと深く(中級

🎬 アニメーション『ログインの裏側』の ④〜⑤ のところです!

照合そのものは「ソルトを付けてハッシュ化→保存値と比較」だけですが、実戦はここが攻防の最前線です:

  1. 攻撃側の第一手は総当たり——対策は試行回数制限(レートリミット)とアカウントロック
  2. 第二手がクレデンシャルスタッフィング※1——他所で漏れたID・パスワードのセットを機械的に試す。複雑なパスワードでも使い回していれば無力
  3. 守り側は失敗応答を「IDかパスワードが違います」に統一して、IDの存在を教えない(ユーザー列挙防止)

登場人物メモ(※の説明):

  • ※1 クレデンシャルスタッフィング — 漏えいした認証情報リストの流し込み攻撃。成功率は数%でも、リストが数億件あるので成立してしまう

⚠️ イレギュラー(攻防の細部):

  • ロックの悪用 — わざと他人のIDで失敗を繰り返し、ロックさせる嫌がらせ(DoS)もある。だからロックは時限式にするなど設計に工夫がいる
  • 応答時間の差 — 「IDが存在する場合だけ処理が遅い」といった挙動の差からIDの存在が漏れることもある

④ 会員証をもらう

🎬 アニメーション『ログインの裏側』の のところです!

照合に成功すると、受付は「しばらく有効な会員証」をくれます(セッションって言います)。

  1. 会員証はブラウザが預かって、以降のページでは会員証を見せるだけで通れる
  2. だからページを移動するたびにパスワードを打ち直さなくていい
  3. 会員証には期限があり、ログアウトすると無効になる
パスワードの作り方 — 結局どうすればいい?

順番に効き目が大きいのは、この3つです:

  1. 使い回さない — これが最重要。1サイト1パスワード。人間には覚えきれないので、パスワード管理アプリ(ブラウザ内蔵のものでOK)に覚えてもらう
  2. 長くする — 8文字より12文字、12文字より16文字。複雑な記号より長さが効く
  3. 2段階にする(2要素認証って言います) — パスワードが漏れても、スマホの確認がないと入れないようにする

逆に、効き目が薄いのに疲れるのが「定期的な変更の強制」。最近は「漏れていないなら変えなくていい、そのかわり使い回すな」が主流の考え方です。

ここまでがログインの1〜2秒の裏側です。仕組み側は「生のパスワードをどこにも置かない」ことであなたを守り、あなた側は「使い回さない」ことで自分を守る——守りは両側で1セットです。

この部分をもっと深く(中級

🎬 アニメーション『ログインの裏側』の のところです!

「しばらく有効な会員証」の正式名はセッション※1 です:

  1. サーバはランダムで推測不能なセッションIDを発行し、DB側に「誰のものか」を記録する
  2. ブラウザにはCookie※2 として渡す。以降のリクエストに自動で添付される
  3. Cookieには HttpOnly / Secure※3 という守りの属性を付ける
  4. ログアウトや「全端末からサインアウト」は、DB側のセッションを消すことで即時に効く

さらに上の守りが2要素認証(2FA)※4——パスワード(知識)に加えて、スマホ(所持)などの2つ目を要求します。パスワードが漏れた後の最後の砦です。

登場人物メモ(※の説明):

  • ※1 セッション — ログイン状態の実体。IDの当てずっぽうが効かないよう、十分長いランダム値にする
  • ※2 Cookie — ブラウザがサイトごとに保管し、自動で送り返す小さなメモ。会員証の入れ物
  • ※3 HttpOnly / Secure — 「ページ内のプログラム(JS)から読めない」「暗号化経路でしか送らない」の2属性。会員証の盗難対策
  • ※4 2要素認証(2FA) — 知識(パスワード)+ 所持(スマホ・鍵)など、性質の違う証明を重ねる方式

⚠️ イレギュラー(会員証が狙われるとき):

  • セッションハイジャック — 会員証そのものを盗めばパスワード不要でなりすませる。HttpOnly・Secure・短い有効期限はこのための守り
  • 公共PCでのログアウト忘れ — 会員証を置きっぱなしにするのと同じ。「全端末からサインアウト」機能はこの回収に使う
このアプリ(Kotowary)は実際どうしているか

本ユニットの内容は、このアプリ自身の実装方針でもあります: パスワードは scrypt でハッシュ化して保存 / セッションはDB管理(即時失効可能) / Cookie は HttpOnly + Secure + SameSite / ログイン失敗の応答は統一 / 認証系エンドポイントにレート制限。学んだ仕組みの実物の上で、いまあなたはログインしています。

まとめ——守りは4層です: 経路(TLS)/ 保存(ソルト+遅いハッシュ)/ 照合(回数制限と列挙防止)/ 会員証(セッション属性と2FA)。流出ニュースを見たら「どの層が破られたのか」を考える。それがこのユニットの読み方です。

関連する知識

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. ログインに失敗したとき「IDかパスワードが違います」とだけ表示され、どちらが違うか教えてくれないのはなぜ?

2. ちゃんとしたサイトで、あなたのパスワードはどう保管されている?

3. パスワードの「使い回し」が危険な一番の理由はどれ?

4. ログインに成功した後、ページを移動しても再ログインを求められないのはなぜ?

5. 「すりつぶし(ハッシュ化)」の説明として最も近いものはどれ?

6. ログインのとき「鍵マーク(https)の付いた道」を通ることが大事なのは なぜ?

7. 本物そっくりの偽サイトに利用者自身がパスワードを入力してしまい 盗まれる手口を カタカナで何と呼ぶ?

8. ログイン成功後にもらう「しばらく有効な会員証」の正式名を カタカナで何と呼ぶ?