2011年11月25日金曜日

WordPressのパスワードを別システムでも使いたいときの認証方法

「WordPressのユーザーを別のシステムに移行する」といった
ちょっと変わった案件に出くわした際のメモ。

パスワードもそのまま移行する仕様ですが、
新しいシステム側のログインチェック時にどうやって比較すれば良いのか、というのが疑問。

WordPressでのパスワードの暗号化(ハッシュ化)


そもそもWordPressのパスワードってどういう形で保存されているのだろう?

  • バージョン2.5以降:phpass
  • バージョン2.5より前:md5

ってことみたい。
バージョンの途中で変わっているようです。

ちなみに、phpassで保存されているかどうかは、DB内のパスワードを見て、
頭の三文字が$P$かどうかを見れば分かるっぽいです。

phpassって何?って方には、こちらの記事がオススメ。
なぜPHPアプリにセキュリティホールが多いのか?:第40回 MOPS:安全性の高いパスワードハッシュ作成ツール - phpass|gihyo.jp … 技術評論社

よりセキュアにってことみたいです。

暗号化:wp_hash_password()


wp-includes -> pluggable.php 内のwp_hash_password()がハッシュ化する関数になります。
requireしているclass-phpass.phpというのがphpassの本体です。

※ソースコードはWordPress 3.2.1から引用。

wp_hash_password()の戻り値がハッシュ化されたパスワードになります。
このパスワードがWordPressのデータベース、 wp_usersテーブルに格納されています。


パスワード比較:wp_check_password()


新しいシステムでは、、WordPressで管理されていたユーザパスワードと、
画面から入力されたパスワードを比較する必要がありました。

どうやって比較すればよいのでしょう。
pluggable.php 内のwp_check_password()を参考にしました。


上記の一行がチェックの処理です。

画面から入力された平文のパスワードと、
データベースに格納されているハッシュ化されたパスワードを、
このCheckPassword()に渡します。

戻り値を判断して、完了です。


関数内では、md5で保存されている場合は「phpassで一度保存し直す処理」が
チェック前に行われています。

ちなみに、今回の案件では、WordPressのバージョンは2.5以降のはずのに、 パスワードはMD5で保存されていました。それで随分とはまりました。