😎
passlibのCryptContextでbcryptを使用して生成したハッシュ値のソルトについて
まずはpasslibをinstall
pip install passlib[bcrypt]
passlib.CryptContextを使ってハッシュを生成・検証する
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
password = 'secret'
hashed = pwd_context.hash(password)
print(hashed)
# $2b$12$BkQYJsyCu9Dc/.iRv/P.XeRF6wmVmp0PMFVB4QSzsLCwI0cm.dyje
print(pwd_context.verify(password, hashed))
# True
ここで生成されたハッシュにはソルトが含まれています(hashed[7:29])。そのため、自分でわざわざソルトをデータベースに保存する必要がありません。
print(f'salt: {hashed[7:29]}')
# salt: BkQYJsyCu9Dc/.iRv/P.Xe
print(f'hash: {hashed[29:]}')
# hash: RF6wmVmp0PMFVB4QSzsLCwI0cm.dyje
このソルトはpwd_context.hashを実行するたびにランダムに生成されるため、ハッシュの値も毎回変わります。CryptContextは、このソルトを用いてハッシュを計算し、検証しているのです。
手動でソルトを取り出しハッシュを検証する
passlib.hash.bcrypt.hashでは、ソルトを指定することができます。
import passlib.hash
def my_verify(password, hashed):
salt = hashed[7:29]
_hashed = passlib.hash.bcrypt.hash(password, salt=salt)
return hashed == _hashed
print(my_verify(password, hashed))
# True
Discussion