我使用了
bcrypt
并且无法随时保存哈希和盐来检查密码,因为我的盐和哈希随时改变。
如何修复我的函数以使用 bcrypt
进行散列和检查密码?
我的尝试:
import bcrypt
def password_hasher(password):
pwd = password.encode()
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(pwd, salt)
return hashed
每次调用
password_hasher
时,您的函数都会生成新的盐,这意味着每次对相同的密码进行哈希处理时,您都会得到不同的哈希值。这是 bcrypt 的预期行为,也是其有助于增强安全性的功能之一。每次使用新的盐对密码进行哈希处理时,即使密码相同,生成的哈希值也会不同。
要根据之前的哈希版本验证密码,您不需要单独存储盐。这是因为 bcrypt 哈希将盐作为结果哈希字符串的一部分。因此,您只需要存储哈希值。
代码的修改版本:
import bcrypt
def password_hasher(password: str) -> bytes:
pwd = password.encode()
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(pwd, salt)
return hashed
def check_password(password: str, hashed_password: bytes) -> bool:
pwd = password.encode()
return bcrypt.checkpw(pwd, hashed_password)
用途:
# Hash a new password
hashed_pw = password_hasher("my_password")
# Check the password against the hashed version
is_valid = check_password("my_password", hashed_pw)
print(is_valid) # This should print True if the password matches