首页 > 解决方案 > Python bcrypt:如何检查由 sha256 加密的长密码?

问题描述

我有一个要编码的长密码。我使用 bcrypt 主教程:

>>> password = b"an incredibly long password" * 10
>>> hashed = bcrypt.hashpw(
...     base64.b64encode(hashlib.sha256(password).digest()),
...     bcrypt.gensalt()
... )

但是,当我使用以下教程检查时,它不匹配:

input_password = "..." # some password
bcrypt.checkpw(input_password.encode("utf8"), hashed)

我想我也必须解码它。应该base64.b64encode(hashlib.sha256(input_password).digest()工作吗?

标签: pythonbcrypt

解决方案


对于将来阅读此内容的任何人:OP是正确的。来自BCrypt GitHub

bcrypt 算法只处理最多 72 个字符的密码,超出的任何字符都将被忽略。为了解决这个问题,一种常见的方法是使用加密哈希(例如 sha256)对密码进行哈希处理,然后对其进行 base64 编码以防止出现 NULL 字节问题,然后再使用 bcrypt 对结果进行哈希处理:

>>> password = b"an incredibly long password" * 10
>>> hashed = bcrypt.hashpw(
...     base64.b64encode(hashlib.sha256(password).digest()),
...     bcrypt.gensalt()
... )

现在回答这个问题:
是的,要检查密码,您可以像以前一样使用密码执行相同的步骤,所以

>>> new_password = base64.b64encode(hashlib.sha256(raw_password).digest())
>>> bcrypt.checkpw(new_password, saved_password)

不要忘记先对密码进行编码,所以对于 Python 3 来说

>>> raw_password = password_string.encode('utf_8')

编码为相同的格式可能是个好主意。


推荐阅读