LoginSignup
5
0

More than 1 year has passed since last update.

werkzeug.security(generated_pw_hash,checked_pw_hash)を読む

Posted at

はじめに

前々からwerkzeug.securityに興味があったので、
今回、表題の機能を調べてみることにしました。

generated_pw_hashを見る

先ずは公式のドキュメントを見る。

公式ドキュメントのリンク

Security Helpers
Changelog
werkzeug.security.generate_password_hash(password, method='pbkdf2:sha256', salt_length=16)
Hash a password with the given method and salt with a string of the given length. The format of the string returned includes the method that was used so that check_password_hash() can check the hash.

The format for the hashed string looks like this:
method$salt$hash

If PBKDF2 is wanted it can be enabled by setting the method to pbkdf2:method:iterations where iterations is optional:

pbkdf2:sha256:80000$salt$hash
pbkdf2:sha256$salt$hash

公式ドキュメントではこんな感じで記述されている。

flaskでコードを記述してみる。

flask
from werkzeug.security import generate_password_hash, check_password_hash

@app.route('/pw')
def pw_check():
    pw = "password"
    i = generate_password_hash(pw)
    return i

プラウザで確認(1回目)
pbkdf2:sha256:260000$rzFFNyrXBBvgZ7sU$c63910b234630df2c0376999c51b74e02484c35ae38845c47c464b38bac5fd47

プラウザにリロードをかけてみる。

プラウザで確認(2回目)
pbkdf2:sha256:260000$IFAymxGymf80SRp1$abd4d4657dd8ae9fee49e7bedcf3d2053c5a1caba16008f0afaba1c6e310141f

1回目と2回目を比較すると、値が変わっていることがわかります。

先ず、文頭のpbkdf2:sha256
公式ドキュメントを見る感じでは、メソッドの部分に該当し、
260000はpbkdf2を反復させる回数。

間のIFAymxGymf80SRp1という文字列がsaltに該当する。
salt_length=16はどうやら文字列の長さを指しているらしい。
最後の長い文字列がhash(ハッシュ化された値)。

sha256
こちらはハッシュ関数。
与えられた文字列・数値を256ビットの値(固定長)に変換する。
SHA-2とSHA-1の二種類があり、こちらはSHA-2に分類される。
SHA-1はGoogleなどで脆弱性が報告されており、基本的にSHA-1は使わない。
どういう仕組みでハッシュ化しているのか、今度調べてみたいと思います。

saltって何?

先程、画面をリロードしたときに値が変わりました。

この値を変えている要素がSaltです。

Saltはハッシュ化する際に元の文字列にランダムな文字列を付与することです。

password+saltの文字列をハッシュ化していたので、
同じpasswordでもhash化された値が変わっています。

一回目がpassword+Aとして、
二回目がpassword+Bでハッシュ化されているので、
値が変わってくるといった具合です。

Saltがないと何が問題なのか?
→ハッシュ関数がわかってしまうと、平文を解読されてしまうから。

また、saltを付与することでハッシュ関数を解読されても、saltが付与された文字列で解読がされるので、パスワードの特定に繋がらない。

checked_password_hash

werkzeug.security.check_password_hash(pwhash, password)
Check a password against a given salted and hashed password value. In order to support unsalted legacy passwords this method supports plain text passwords, md5 and sha1 hashes (both salted and unsalted).

Returns True if the password matched, False otherwise.

Parameters
pwhash (str) – a hashed string like returned by generate_password_hash().

password (str) – the plaintext password to compare against the hash.

Return type
bool

checked_password_hashはpwhashとpasswordの値を比較して、TrueかFalseを返す。

ドキュメントの説明文を見た感じだと、
saltも含まれる値で引数に渡されるらしい。

先程のreturnの返り値にはsaltも含まれていたので、
saltもわかっている状態で引数が渡されるから、saltを入れた上で
パスワードの認証ができるということなんでしょうか。
(ソースコードを見つけられなくて、予想にはなってしまいますが。。。)

終わりに

何か間違った情報などあれば、ご指導ご鞭撻のほどお願いします。
(お手柔らかにお願いします)

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0