djangoのパスワード
PHPからdjangoのユーザ認証する方法を検討した。
参考資料
- Djangoドキュメント Password management in Django
- hash_pbkdf2
djangoはどのようにパスワードを保存しているか
djangoのデータベースは既定ではdb.sqlite3。sqlite3コマンドで中身を確認する。
$ sqlite3 db.sqlite3
sqlite> .tables
パスワードの入っているテーブルはauth_user。データベースのフィールド名を確認するためヘッダを表示する。
sqlite> .header on
ユーザを表示してみる。
sqlite> select * from auth_user
ユーザ名はusername,パスワードはpasswordに入っている。SQLで特定のユーザのパスワードを表示する。例えばjoeのパスワードは取り出すには,次のようにする。
sqlite> select password from auth_user where username==’joe’
パスワードは次の形式で保管されている。
アルゴリズム$繰り返し数$ソルト$ハッシュ値
django 2.2時点で既定のアルゴリズムはpbkdf2のsha256(pbkf2_sha256),繰り返し数は150000。ハッシュ値はbase64エンコードされている。
PHPでパスワードからハッシュ値を生成するには,hash_pbkdf2()とbase64_encode()を使う。
$hash = base64_encode(hash_pbkdf2(“sha256”, $password, $salt, $iterations, 0, true));
データベースで取得したハッシュ値と$hashを比較すればよい。