werkzeug.securityでハッシュ化するコードを見て、
意味を理解したくて調べた内容を記載します。
前提として全然理解できなかったです。
werkzeug.securityの基本的な使い方
generate_password_hash関数でハッシュ化できて、
check_password_hash関数で元の文字列と同じかを判定できます。
generate_password_hashで作成されるハッシュは毎回違うものになっているので、
作られて2つのハッシュを比較してもFalseになります。
なので元の文字列と同じかを判定するためにはcheck_password_hashを使う必要があります。
from werkzeug.security import generate_password_hash, check_password_hash
hash1 = generate_password_hash('hogehoge')
hash2 = generate_password_hash('hogehoge')
print(hash1) # pbkdf2:sha256:150000$*********
print(hash2) # pbkdf2:sha256:150000$*********
print(hash1 == hash2) # False
print(check_password_hash(hash1, 'hogehoge')) # True
werkzeug.securityを暗号化で仕様するケース
とほほの暗号化入門の超サマリを見ると
暗号化するためにはSHA-512でソルトのストレッチングを10,000回程度つけるとよいそうです。
generate_password_hash関数のコードを見るとデフォルト引数でmethod=sha256
, salt_length=16
になっていたので、method='sha516, salt_length=10000'
に変えればよさそうです。
from werkzeug.security import generate_password_hash, check_password_hash
hash1 = generate_password_hash('hogehoge', method='sha512', salt_length=10000)
hash2 = generate_password_hash('hogehoge', method='sha512', salt_length=10000)
print(hash1) # sha512$*********
print(hash2) # sha512$*********
print(hash1 == hash2) # False
print(check_password_hash(hash1, 'hogehoge')) # True
そもそもwerkzeugとはなにか?
GitHubにはWSGIのユーティリティライブラリだと記載があります。
WSGI(Web Server Gateway Interface)はWebアプリとサーバーとをつなぐためにインターフェイスで
PEP3333で定義されてPythonで広く使わているということ。
FlaskはWerkzeugをラップして作られているそうです。
インターフェイスの1つとしてsecurityに関するハッシュ化関数も実装されていると理解しました。
werkzeug.securityのコード
標準ライブラリのhashlibが使われているのかな?と思って確認したぐらいです。
それ以上は難しくて読み取り断念しました。
hashlibに関してもハッシュ化してくれるライブラリですが、
同じ文字は同じハッシュになってしまいます。
hashlibでもsha512でのハッシュ化も可能だし、
ソルトつけたりはできそうでしたが、werkzeug.securityを使った方がチェックが楽そうでした。
import hashlib
hash1 = hashlib.sha256(b'hogehoge').hexdigest()
hash2 = hashlib.sha256(b'hogehoge').hexdigest()
print(hash1) # *********
print(hash2) # *********
print(hash1 == hash2) # True