gpt4 book ai didi

python - 遍历数据库端的表来比较bcrypt哈希后的密码

转载 作者:行者123 更新时间:2023-11-29 10:11:03 25 4
gpt4 key购买 nike

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

在 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) 完成的而不是再次散列。使用这种方法,我能想到的唯一选择是选择整个用户表并在服务器端遍历它。但我想在数据库端进行遍历!我如何使用 bcrypt 哈希方法来完成此操作?

最佳答案

bcrypt 的整个工作方式是,它为您提供一个值,该值将散列密码和盐组合成一个值供您存储。

这意味着您无法在没有盐的情况下根据密码重新创建哈希值,而您没有盐。

您需要通过您可能拥有的一些 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

如果这没有意义,请大喊。

关于python - 遍历数据库端的表来比较bcrypt哈希后的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50948385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com