【问题标题】:Bad format of password when pulled out of DB退出数据库时密码格式错误
【发布时间】:2021-04-01 18:33:06
【问题描述】:

我刚刚编写了一个简单的脚本,询问用户的用户名和密码。然后它将数据存储到数据库中。但是,当我提取数据(用户想要登录)时,它显示错误:TypeError: expected string or bytes-like object.

我尝试重新格式化密码,但没有任何帮助。它确实告诉我错误就在这里:

line 27, in pull_from_db
    check_hash(password, hashed)
line 11, in check_hash
    if bcrypt.checkpw(password.encode('utf-8'), hashed):

This 是脚本。

【问题讨论】:

  • 请将代码添加到问题本身。 Stack Overflow 上不接受代码链接。

标签: python sql sqlite hash bcrypt


【解决方案1】:

当查询完全失败时,您可能会得到类型不匹配,返回 null/nothing。所以 null 肯定不是字符串,也不是字节类对象。

使用外部数据库客户端(对于 SQLite3,命令行客户端会这样做)以独立运行查询。

sqlite3 ex1
sqlite> SELECT * FROM master

最好只看看里面有什么,确保它被正确存储。

对于您的 put_to_db() 函数,我建议将您的参数重命名为 username,hash,因为您肯定 没有 在其中传递密码,并且您不想对此感到困惑。 ?

【讨论】:

  • 我改了变量名,对程序没有影响。输入存储如下: ('coma', b'$2b$16$tn7kBtMAFYLdScsIX3fSrOrlr8JX/EN7g93LuR4ubPekAGjFI5bRS') ('toto', b'$2b$16$7Cp.gDImk8mP6fRZx9Jbz.VBy3OKVQ.ce/kgqK7aJvo7zEIPlnZa',' b'$2b$16$5viLa0XfuG7vwkJsorLMiuK6SeUG9AOOOIulpxQupNdWLgKsF9ADO') 我会按照您的建议尝试使用外部数据库。感谢您的回复。
  • 哦,是的,它不会改变功能,只是让你更清楚你在那里得到的是一个哈希值,而不是一个实际的密码。
  • 即使我不使用 b'' 字符串,它也被存储为 b'$2b$16$nEj1kUihMMKe6youUSS0kOqO4LT64o6IANOp0qBtWmxzW3N6nPVou' 。也许这就是问题所在?
  • 那些看起来像正确的散列密码......除了那个领先的b。引号也不应该在那里。散列函数会自动将盐添加到散列中。它应该看起来像:$2b$16$nEj1kUihMMKe6youUSS0kOqO4LT64o6IANOp0qBtWmxzW3N6nPVou
  • 那个 b'' 在那里,因为我将它编码为 utf-8。 (password.encode('utf-8'))。但是,如果我删除该编码,则会出现错误:Unicode 对象必须在散列之前进行编码。
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 2015-03-11
  • 2020-08-24
  • 2013-09-20
  • 2013-09-28
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多