bcrypt.checkpw 返回 TypeError: Unicode-objects must be encoded before checking

新手上路,请多包涵

我正在调用 bcrypt.checkpw 检查未加密的密码是否与存储在凭证数据库中的散列密码匹配,但收到

TypeError:Unicode 对象必须在检查前编码

我应该如何解决这个问题?有什么建议吗?

我安装了 python 2.7.6bcrypt 3.1.1

我有以下代码:

 def check_password(password, hashed_password)
    if not bcrypt.checkpw(password, hashed_password):
        raise InvalidCredentials("403 Forbidden")
    else:
        return true

并收到以下错误:

文件“/home/qt/virtualenv/lib/python2.7/site-packages/bcrypt/ init .py”,第 100 行,在 checkpw

raise TypeError(“Unicoed-objects must be encoded before checking”)

TypeError:Unicode 对象必须在检查前编码

我调查了 bcrypt/__init__.py ,但我不确定为什么

def checkpw(password, hashed_password):
    if (isinstance(password, six.text_type) or
        isinstance(hashed_password, six.text_type)):
    raise TypeError("Unicode-objects must be encoded before checking")

原文由 user7153744 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 707
1 个回答

我假设您使用 Python 3。在 Python 3 中,字符串默认为 unicode 字符串。

如果您使用 unicode 值调用 bcrypt.checkpw() 函数:

 import bcrypt

password = "seCr3t"  # unicode string
hashed_password = "hashed_seCr3t"  # unicode string

bcrypt.checkpw(password, hashed_password)

你会得到这个例外

Traceback (most recent call last):
  ...
TypeError: Unicode-objects must be encoded before checking

原因很简单:加密函数仅适用于字节字符串(实际上是数组)。

您的 password 和 _hashedpassword 必须都是字节串。

如果您使用 bcrypt.hashpw() 函数,您的 _hashedpa ssword 必须是字节字符串,我认为问题出在 密码 值上。此 密码 必须来自类似的 HTML 形式。要使用 bcrypt.checkpw() 函数,您必须首先使用与使用 bcrypt.hashpw() 函数加密 密码 时相同的编码对字符串值进行编码。通常,我们选择’utf8’编码。

例如(Python 2 和 3):

 import bcrypt

# at creation first:
password = u"seCr3t"
hashed_password = bcrypt.hashpw(password.encode('utf8'), bcrypt.gensalt())

# first attempt:
password = u"seCrEt"
bcrypt.checkpw(password.encode('utf8'), hashed_password)
# -> False

# second attempt:
password = u"seCr3t"
bcrypt.checkpw(password.encode('utf8'), hashed_password)
# -> True

Gihub 页面 上查看简单用法

原文由 Laurent LAPORTE 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题