⌨️

passlibのCryptContextでbcryptを使用して生成したハッシュ値のソルトについて

2023/02/19に公開

まずは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