猿问

遍历数据库侧的表以比较bcrypt散列的密码

在登录路径上,我检索了密码。我如何在数据库中找到具有匹配的哈希密码的用户而不获取整个用户表并在服务器上遍历它?

在mysql中,每个用户都可以通过注册获得哈希密码。我是这样生成的:bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

如果我在登录时执行相同的方法(对于相同的纯文本密码),则会得到不同的哈希值。

所以像这样:

select * from User where hash_generated_at_register = hash_generated_at_login

即使登录和注册步骤中使用的纯文本密码相同,也会失败。

据我了解,bcrypt中的密码检查是通过完成bcrypt.checkpw(password, hash)而不是再次进行哈希来完成的。使用这种方法,我唯一想到的选择是选择整个User表并在服务器端进行遍历。但是我想在数据库端遍历!如何使用bcrypt哈希方法完成此操作?


慕莱坞森
浏览 188回答 2
2回答

慕丝7291255

bcrypt的整个工作方式是,它为您提供了一个值,该值将散列的密码和salt组合为一个值供您存储。这意味着您不能在没有盐的情况下使用密码重新创建哈希。您需要通过数据库中user_id可能存在的用户来选择该用户,然后使用bcrypt库将您的密码与您存储的组合值进行比较。bcrypt.hashpw(password, hash_and_salt_value_from_db)您可以使用与创建“哈希”相同的函数,但可以传入您的存储值。该函数足够聪明,可以认识到它是一个哈希+盐,将为您提取和使用盐。所以你想检查一下if hash_and_salt_value_from_db == bcrypt.hashpw(password, hash_and_salt_value_from_db):    # tada, valid password喊,如果这没有道理。
随时随地看视频慕课网APP

相关分类

Python
我要回答