WordPressのデータベース流出でパスワードも流出するの?(bcrypt)

会員制のWordPressサイトでは、ユーザー登録によってパスワードを管理します。サイトの不正アクセスなどでデータベースが流出した場合、登録されたパスワードはどのような危険にさらされるのでしょうか?特にWordPress 6.8から採用されたbcryptの安全性を考えてみました。

WordPressのパスワード保存の仕組み

WordPressでは、ユーザー情報を「wp_users」テーブルに保存しています。ここには、ユーザーID、ログイン名、パスワード(ハッシュ化された値)などが記録されています。大切なのは、パスワードが「そのまま」保存されていないことです。

WordPressのパスワード保存の仕組み 保存場所 wp_usersテーブル user_passカラム ※生のパスワードは保存しない ハッシュ化とは 一方通行の変換処理 元に戻せない形に変換 WordPress 6.8で変更 旧方式: PHPass 従来の暗号化方式 現代のコンピュータでは 突破される可能性が上昇 新方式: bcrypt 高度な暗号化方式 計算に時間がかかる設計 攻撃者への大きな障壁

パスワードは「user_pass」カラムに保存されますが、これは「ハッシュ化」という処理が施されています。ハッシュ化とは、元の文字列を特殊な計算方法で変換し、元に戻せない形にすることです。

例えるなら、卵と小麦粉と砂糖を混ぜて焼いたクッキーから、元の卵と小麦粉と砂糖の量を正確に復元できないようなものです。混ぜて焼くという一方通行の変化なのです。

WordPress 6.8で変わったこと(bcrypt)

WordPress 6.8より前では、パスワードのハッシュ化に「PHPass」という方法が使われていました。これは古くから使われてきた方式ですが、今のコンピュータの性能では突破される可能性が高まっていました。

WordPress 6.8からは「bcrypt」という新しい方式に変更されました。bcryptの最大の特徴は、計算に時間がかかるように設計されていることです。通常の使用ではほとんど気にならない程度ですが、大量のパスワードを試す攻撃者にとっては大きな障壁となります。

WordPressのユーザー情報データベース構造

WordPressのユーザー情報は、wp_usersで「基本情報」、wp_usermetaで「拡張情報」という2つのテーブルで管理されています。

プラグインやテーマによっては、wp_usermetaに独自のユーザーメタデータが追加される場合があり、この構造により、WordPressは柔軟にユーザー情報を管理できるようになっています。

また、 投稿や固定ページの作成者情報はwp_postsテーブルの post_author カラムにユーザーIDとして保存されます。

wp_users テーブル

このテーブルには、ユーザーの基本情報が保存されます。主なカラムは:

カラム名内容
IDユーザーID(プライマリーキー)
user_loginログイン名
user_passパスワード(ハッシュ化された値)
user_email登録メールアドレス
user_urlユーザーのWebサイトURL
user_registered登録日時
display_name表示名

wp_usermeta テーブル

このテーブルには、ユーザーごとの追加情報(メタデータ)が保存されます。例えば、プロフィール情報や権限、管理画面の配色設定などです。ユーザーの姓や名、管理画面の言語設定などが wp_usermeta テーブルに保存されます。

カラム名内容
umeta_idメタデータID(プライマリーキー)
user_id対象ユーザーのID(wp_users.IDと紐付く)
meta_keyメタデータのキー
meta_valueメタデータの値

データベースが流出したらどうなる?

仮にWordPressのデータベースが流出した場合、パスワードのハッシュ値も漏れてしまいます。では、これで本当に危険なのでしょうか?

パスワード保護の2段階防御:ハッシュとソルト データベース流出時の危険性 bcryptハッシュの効果 ソルトの効果 一方向変換 ハッシュ値から元の パスワードを復元不可能 計算コスト 処理に時間がかかり 総当たり攻撃が困難 ランダム値追加 パスワードに ランダムな値を追加 同一パスワード対策 同じパスワードでも 異なるハッシュ値になる パスワード「123456」→ ハッシュ値:$2a$10$… 同じ「123456」でも→ 別ユーザー:$2a$10$xyz…

bcryptでハッシュ化されたパスワードは、次の理由から安全性が高いと言えます:

  1. 一方向の変換なので、ハッシュ値から元のパスワードを直接「復元」することはできません。
  2. bcryptは計算に時間がかかるため、総当たり攻撃(あらゆる組み合わせを試す攻撃)が非常に困難です。
  3. 「ソルト」と呼ばれるランダムな値がパスワードごとに自動生成され、同じパスワードでも異なるハッシュ値になります。

ソルトとは、パスワードにランダムな文字列を付け加えることです。例えば「123456」というパスワードでも、ユーザーAには「123456abc」、ユーザーBには「123456xyz」として処理されるイメージです。これにより、同じパスワードを使っていても異なるハッシュ値が生成されます。

料理に例えると、同じ材料でも塩加減が違うと味が変わるように、ソルトによって同じパスワードでも異なる「味」(ハッシュ値)になります。

リスクは完全にゼロではない

bcryptによる保護は非常に強力ですが、リスクが全くないわけではありません。

極端に単純なパスワード(「123456」や「password」など)は、どんなに優れたハッシュ化方式でも危険です。これらは最初に試されるパスワードなので、見つかりやすいのです。

また、攻撃者のコンピュータ性能が向上し続けると、将来的にはbcryptでも突破される可能性はゼロではありません。コンピュータの世界は常に進化しているからです。

自分を守るためにできること

データベースが流出しても安心できるよう、次のことを心がけましょう:

  1. 強力なパスワードを使用する:
    長さがあり、大文字・小文字・数字・記号を含むものが理想的です。
  2. サイトごとに異なるパスワードを使う:
    一つのサイトが漏れても、他のサイトは安全です。
  3. パスワードマネージャーを使う:
    複雑なパスワードを覚える必要がなくなります。
  4. 可能であれば二要素認証を有効にする:
    パスワードが漏れても、二つ目の認証がなければログインできません。

まとめ

WordPress 6.8からのbcryptハッシュ化により、データベース流出時のパスワード保護は格段に強化されました。bcryptの計算コストの高さと内部ソルト機能により、ハッシュ値から元のパスワードを復元することは非常に困難です。しかし、単純なパスワードは常にリスクがあるため、強力で一意なパスワードの使用がユーザー側の重要な対策となります。

  1. WordPress 6.8 のログインパスワードをデータベースから変更する方法
  2. How WordPress 6.8 Will Strengthen Password Security and Hashing
  3. WordPress 6.8「セシル」の新機能と変更点の解説
  4. WordPress Salts: A Complete Guide
  5. WordPress のデータベース構造
  6. What type of hash does WordPress use?
  7. How Does WordPress Hash Passwords?
  8. パスワードのリセット – サポートフォーラム – WordPress.org 日本語