6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

werkzeug.securityでハッシュ化

Posted at

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
6
5
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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?