DjangoではパスワードはデフォルトでPBKDF2というハッシュ関数を用いてハッシュ化(暗号化)して保存しています。この記事ではDjangoがどのようにパスワードを保存しているのかと、ハッシュ化アルゴリズムを変更する方法について解説します。
目次
Djangoがどのようにパスワードを保存しているか
実際にDjangoがどのようにパスワードを保存しているか見てみましょう。
Djangoの管理サイト(Django Admin)にアクセスし、「ユーザー」テーブルの「ユーザー名」、ここでは入門編で制作したadminのデータを見てみましょう。
パスワードの項目は次のようになっています。
- アルゴリズム: pbkdf2_sha256
- イテレーション: 390000
- ソルト: 3zKJp8****************
- ハッシュ: 5IABob**************************************
Djangoではパスワードは文字列をそのまま保存しているわけではなく、このようにハッシュ化(暗号化)されて保存されています。
こうすることでサーバーや管理サイトに不正アクセスがあったとしても、少なくともすぐにはパスワードが漏れてしまうことはありません。
ハッシュ化することで簡単に元のパスワードに戻すことができないようになっており、Webアプリの管理者でもユーザーのパスワードは推測できないようになっています。
ハッシュ化アルゴリズムを変更する方法
DjangoではデフォルトでPBKDF2というハッシュ化アルゴリズムを使用していますが、これは設定で変更することができます。
Djangoで使えるhasherは以下の公式ドキュメントで確認できます。
https://docs.djangoproject.com/ja/4.2/topics/auth/passwords/#included-hashers
ハッシュ化アルゴリズムを変更するにはsettings.py の PASSWORD_HASHERS 変数を追加し、次のように記述します。
PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.Argon2PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.MD5PasswordHasher', 'django.contrib.auth.hashers.SHA1PasswordHasher', ]
この場合、Argon2、BCrypt、PBKDF2、MD5、SHA1の順で試行します。
ただし、MD5やSHA1などの古いハッシュアルゴリズムはセキュリティ上のリスクが高いため、Argon2やBCrypt、PBKDF2のような強力なハッシュアルゴリズムを利用することをおすすめします。