【问题标题】:How to fix "TypeError: Unicode-objects must be encoded before hashing" on bcrypt.hashpw如何修复 bcrypt.hashpw 上的“TypeError:Unicode 对象必须在散列之前编码”
【发布时间】:2019-01-25 22:24:42
【问题描述】:

我正在设置一个服务器,在我的登录页面上,我使用 bycrpt 的 hashpw 函数对密码进行哈希处理,然后再将它们存储到数据库中。当我单击登录时,我收到错误消息“TypeError:Unicode 对象必须在散列之前进行编码”我尝试在使用 .encode() 和 .encdoe('utf-8') 在多个位置对密码进行散列之前对密码进行编码和时间。

这是 Windows Server 2019 的副本(在 AWS EC2 实例上),运行 Python 3.7 和 Sqlite3。这运行了一段时间,当我更换计算机时,它停止了工作。

这是我的登录页面代码:

def loginpage():
    global error
    if request.method == "POST":
        usrname = request.form['username']
        pswd = request.form['password']
        if not db.checkExists(usrname):
            error = "Invalid username or password!"
        elif not db.checkValidUser(usrname, pswd.encode('utf-8')):
            error = "Invalid username or password!"
        else:
            session['loggedIn'] = True
            session['user'] = request.form['username']
            if session.get('prevurl') == None:
                return redirect(url_for('index'))
            else:
                prev = session.get('prevurl')
                session['prevurl'] = ''
                return redirect(url_for(prev))
    return render_template('login.html', **globals())

这是我的数据库处理程序代码:

def checkValidUser(username, password):
    #get salt and hash passwords
    if not checkExists(username):
        return False
    salt = getSalt(username)
    salt = salt[0][0]
    #password = password.encode('utf-8')
    password = bcrypt.hashpw(password, salt)
    #connect to database
    con = sql.connect(sqlite_db_file)
    cur = con.cursor()
    cur.execute("SELECT * FROM users WHERE username=? AND password=?", (username, password))
    validUser = cur.fetchall()
    con.close()

    if not validUser:
        return False
    return True

当我单击登录时,我应该看到“用户名或密码不正确”的错误消息,或者在登录时被重定向到主页。相反,我收到一个 typeError,告诉我必须对 unicode 对象进行编码。如果你知道一些可以帮助的东西,我很感激你的帮助!

【问题讨论】:

  • 尝试编码盐。
  • 感谢@Debendra 的建议,但我似乎已经解决了这个问题。错误已经消失并且登录正常,我只是不知道我做了什么。当我下次遇到这个错误时,我会尝试这个建议,看看它是否有效。感谢您的帮助!

标签: python-3.x flask sqlite bcrypt


【解决方案1】:

问题可能与bcryptpy-bcrypt 之间的差异有关,正如here on github 所讨论的那样。

这些是不同的模块。 bcrypt 需要字节(编码字符串),py-bcrypt 需要字符串(str)。因此,如果您不想更改代码,则必须安装 py-bcrypt

我不确定它是否具有相同的功能集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多