kuroの覚え書き

96の個人的覚え書き

パスワードの設定

パスワードはハッシュアルゴリズムによって暗号化してファイルに記載するのが重要なのだが、今時はハッシュ化をさらに何回も繰り返すことで攻撃者を撃退するらしい。そのために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)