会員制のWordPressサイトでは、ユーザー登録によってパスワードを管理します。サイトの不正アクセスなどでデータベースが流出した場合、登録されたパスワードはどのような危険にさらされるのでしょうか?特にWordPress 6.8から採用されたbcryptの安全性を考えてみました。
WordPressのパスワード保存の仕組み
WordPressでは、ユーザー情報を「wp_users」テーブルに保存しています。ここには、ユーザーID、ログイン名、パスワード(ハッシュ化された値)などが記録されています。大切なのは、パスワードが「そのまま」保存されていないことです。
パスワードは「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のデータベースが流出した場合、パスワードのハッシュ値も漏れてしまいます。では、これで本当に危険なのでしょうか?
bcryptでハッシュ化されたパスワードは、次の理由から安全性が高いと言えます:
- 一方向の変換なので、ハッシュ値から元のパスワードを直接「復元」することはできません。
- bcryptは計算に時間がかかるため、総当たり攻撃(あらゆる組み合わせを試す攻撃)が非常に困難です。
- 「ソルト」と呼ばれるランダムな値がパスワードごとに自動生成され、同じパスワードでも異なるハッシュ値になります。
ソルトとは、パスワードにランダムな文字列を付け加えることです。例えば「123456」というパスワードでも、ユーザーAには「123456abc」、ユーザーBには「123456xyz」として処理されるイメージです。これにより、同じパスワードを使っていても異なるハッシュ値が生成されます。
料理に例えると、同じ材料でも塩加減が違うと味が変わるように、ソルトによって同じパスワードでも異なる「味」(ハッシュ値)になります。
リスクは完全にゼロではない
bcryptによる保護は非常に強力ですが、リスクが全くないわけではありません。
極端に単純なパスワード(「123456」や「password」など)は、どんなに優れたハッシュ化方式でも危険です。これらは最初に試されるパスワードなので、見つかりやすいのです。
また、攻撃者のコンピュータ性能が向上し続けると、将来的にはbcryptでも突破される可能性はゼロではありません。コンピュータの世界は常に進化しているからです。
自分を守るためにできること
データベースが流出しても安心できるよう、次のことを心がけましょう:
- 強力なパスワードを使用する:
長さがあり、大文字・小文字・数字・記号を含むものが理想的です。 - サイトごとに異なるパスワードを使う:
一つのサイトが漏れても、他のサイトは安全です。 - パスワードマネージャーを使う:
複雑なパスワードを覚える必要がなくなります。 - 可能であれば二要素認証を有効にする:
パスワードが漏れても、二つ目の認証がなければログインできません。
まとめ
WordPress 6.8からのbcryptハッシュ化により、データベース流出時のパスワード保護は格段に強化されました。bcryptの計算コストの高さと内部ソルト機能により、ハッシュ値から元のパスワードを復元することは非常に困難です。しかし、単純なパスワードは常にリスクがあるため、強力で一意なパスワードの使用がユーザー側の重要な対策となります。
- WordPress 6.8 のログインパスワードをデータベースから変更する方法
- How WordPress 6.8 Will Strengthen Password Security and Hashing
- WordPress 6.8「セシル」の新機能と変更点の解説
- WordPress Salts: A Complete Guide
- WordPress のデータベース構造
- What type of hash does WordPress use?
- How Does WordPress Hash Passwords?
- パスワードのリセット – サポートフォーラム – WordPress.org 日本語