Werkzeug タグの一覧です(2 件)

Werkzeug の generate_hashed_password がストレッチングに対応していた(のを知らなかった件)

先日ふと Werkzeug のドキュメントを読み返していたら generate_hashed_ password がストレッチングに対応していることに気付きました。

対応されたのはいつからだろうと思い、リリースを調べたら Ver 0.9 (2013年6月) で追加されていますね(今は Ver0.9.6 )全然知らなかった(汗。。

まあ、気付かなかったのはライブラリをアップデートしても今までの文字列パターン( method$salt$hash )で使用出来ていたからですね(後方互換大事)。

このブログではパスワードハッシュに generate_hashed_ password で生成したものを使い、 check_password_hash で照合しています。とりあえずストレッチング仕様のパスワードハッシュに置き換えることにします( OS X 10.10.1 Python3.4.2 で確認)

In [1]: from werkzeug import generate_password_hash

In [2]: pw_hash = generate_password_hash('default')

In [3]: pw_hash
Out[3]: 'pbkdf2:sha1:1000$hldobvVq$cf3ea3d710ddf58609f0c8ee25630e70bca8fc76'

method$salt$hash が pbkdf2:method:iterations$salt$hash になっています。これがデフォルトのようです。
ちなみに照合はこうなります

In [4]: from werkzeug import check_password_hash

In [5]: check_password_hash(pw_hash, 'default')
Out[5]: True

In [6]: check_password_hash(pw_hash, 'defaultx')
Out[6]: False

ストレッチングについてはこちらが詳しいですね
本当は怖いパスワードの話(3/4) - @IT

ちなみに前回のエントリーはこちら
[Werkzeug][Flask]FlaskをSalted Passwordsに対応させる | aoshiman.org

Flaskのスニペット
Salted Passwords | Flask (A Python Microframework)


[Werkzeug][Flask]FlaskをSalted Passwordsに対応させる

本当は怖いパスワードの話(1/4) - @ITを読んでなるほどなぁって思っていたのですが、それじゃあFlaskでソルト化(ソルト化っていう言葉が正しいかわかりませんが今回はこう書きます)ってどうやるんだろうかと調べたら、そのものズバリの事例がスニペット集に載っていました。


つまりはWerkzeug(ヴェルクツォィグって読む)がソルト化とそのチェック機能を提供してくれるとのこと。せっかくなのでこのBlogの管理者ログインパスワードをソルト化しました。

generate_password_hashを使ったパスワードのハッシュ+ソルト化

スニペットではwerkzeug.securityのgenerate_password_hashとcheck_password_hashを使ったclassを作成していますが、今回はあくまで個人Blogでの管理者パスワードのみ対応ですので、コマンドラインで作ります。 こちらを参考に
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> from werkzeug.security import generate_password_hash
>>> generate_password_hash("orenopass")
'sha1$4wGWLe5J$d1babced1d89ad9ff811107b7f42ca866fd7b65d'
>>> 

ついでにチェックをしてみます
>>> from werkzeug.security import check_password_hash
>>> ssha1 = 'sha1$4wGWLe5J$d1babced1d89ad9ff811107b7f42ca866fd7b65d'
>>> check_password_hash(ssha1,'orenopass')
True
>>> check_password_hash(ssha1,'omaenopass')
False

Blogに組み込む

生成されたソルト化されたハッシュをブログに組み込みます。私の場合はコンフィグファイルに各種設定値を記述しているのでそちらを編集します。今までPASSWORDが記述されていたところにHASHPASSWORDを記載し、PASSWORD項目は削除します。
% vi ./oreno.cfg

SQLALCHEMY_DATABASE_URI = 'sqlite:////Path/to/www/app/oreno.db'
SQLALCHEMY_ECHO = False
SECRET_KEY = 'SECRET_KEY'
USERNAME = 'orenonamae'
HASHPASSWORD = 'sha1$4wGWLe5J$d1babced1d89ad9ff811107b7f42ca866fd7b65d'
DEBUG = True

次に認証ロジックを修正します。
% vi ./app.py

@app.route('/login', methods=['GET','POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != app.config['USERNAME']:
            error = 'Invalid username'
        elif not check_password_hash(app.config['HASHPASSWORD'],request.form['password']):
            error = 'Invalid password'
        else:
            session['logged_in'] = True
            flash('You were logged in')
            return redirect(url_for('show_entries'))
    return render_template('login.html', error = error)

werkzeug.securityのcheck_password_hashを使用します。入力されたパスワードとcfgファイルに記述されたソルト化されたハッシュを照合させています。

今回色々と調べてみて、この本に興味が湧いてきたので購入してみようかなと思います。
PAGE TOP