エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、Pythonのpasslib/bcryptを使ってハッシュ値(hash value)の作成/取得/検証を行う方法を紹介していきます。
動作確認には、Visual Studio Code (VS Code) を使用しているため、同様に確認したい方は、こちらの記事でVS CodeのPython開発環境を構築してみてください。
passlibインストール(pip install passlib)
Pythonでpasslibパッケージを使うので、以下のpipコマンドでインストールします。
1 |
pip install passlib |
passlibの詳細については、こちらを参照ください。
bcryptインストール(pip install bcrypt)
パスワードハッシュ化関数を含むライブラリであるbcryptも使用するので、以下のpipコマンドでインストールします。
1 |
pip install bcrypt |
ハッシュ値の作成/取得/検証を行うサンプルプログラム
passlibを使ってハッシュ値の作成/取得/検証を行うサンプルプログラムは、以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from passlib.context import CryptContext pwt_context = CryptContext(schemes=["bcrypt"], deprecated="auto") class Hasher(): @staticmethod def verify_password(plain_password, hashed_password): return pwt_context.verify(plain_password, hashed_password) @staticmethod def get_password_hash(plain_password): return pwt_context.hash(plain_password) |
パスワードハッシュ関数を使ってパスワードからハッシュ値を取得したり、パスワードとハッシュ値からハッシュ値が正しいか検証するメソッドをHasherクラスに定義したサンプルプログラムです。
ハッシュ値の作成/取得/検証を行うサンプルプログラムの動作確認
Pythonの対話モードを使って、先程のHasherクラスの各メソッドの動作を確認していきましょう。
1 2 3 4 5 6 7 8 9 10 |
> python Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from hashing import Hasher >>> Hasher.get_password_hash("Hello") '$2b$12$8b1kK4RqtE21jmBPyEHxVeeB7bAWaxpk/Dq3M9V6.iKF1cTgfmOWm' >>> Hasher.verify_password("Hello","$2b$12$8b1kK4RqtE21jmBPyEHxVeeB7bAWaxpk/Dq3M9V6.iKF1cTgfmOWm") True >>> Hasher.verify_password("Hell","$2b$12$8b1kK4RqtE21jmBPyEHxVeeB7bAWaxpk/Dq3M9V6.iKF1cTgfmOWm") False |
便利なツール紹介(bcrypt-hash-generator)
こちらのサイトで同様にハッシュ値を生成したり(添付画像の左)、検証することができます(添付画像の右)。
まとめ
いかがでしたでしょうか。
今回は、Pythonでハッシュ値を作成/取得/検証を行う方法を紹介してきました。
ログインパスワード等の秘匿性の高い情報を扱うときにハッシュ値を使用するため、セキュリティ対策が必須となっている今日では必ず習得しておきたい技術の一つです。
前述してきたようにPythonのpasslibを使うと、簡単にハッシュ値の生成/取得/検証が可能であることがわかったかと思うので、本記事でしっかりおさえてもらえたらと思います。
【関連記事】
【Python Flask入門】ログイン・サインアップ機能実装方法(flask-login)