パスワードはハッシュアルゴリズムによって暗号化してファイルに記載するのが重要なのだが、今時はハッシュ化をさらに何回も繰り返すことで攻撃者を撃退するらしい。そのためにBcryptを導入する。
app/__init__.pyに以下を追加
from flask_bcrypt import Bcrypt bcrypt = Bcrypt(app)
app/config.pyに何回ハッシュ化を繰り返すかの設定を追加
BCRYPT_LOG_ROUNDS = 12
回数は非力なmacbookでテストするなら5回くらい(大体0.5秒位に収まる回数をセットする)
どれくらい時間がかかるかのテストプログラム
test.py
from flask.ext.bcrypt import generate_password_hash generate_password_hash('password1', 12)
これをコマンドラインから
$ time python3 test.py real 0m0.406s user 0m0.327s sys 0m0.055s
このようにテストしてやって回数を調節する。
models.pyにセッターを定義しておいて、ここでパスワードのハッシュ処理をさせる。
app/models.py
from sqlalchemy.ext.hybrid import hybrid_property from . import bcrypt, db #bcryptを追加 class User(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(64), unique=True) _password = db.Column(db.String(128)) #ここから下を追加 @hybrid_property def password(self): return self._password @password.setter def _set_password(self, plaintext): self._password = bcrypt.generate_password_hash(plaintext)