Python bcrypt TypeError: Unicode-objects must be encoded before checking

Python bcrypt TypeError: Unicode-objects must be encoded before checking

我正在尝试使用 bcrypt (Python) 创建一个安全的登录系统。

现在我得到的错误是 TypeError: Unicode-objects must be encoded before checking。 我知道 bcryptcheckpw() 仅将 bytes 作为数据类型,但正如您在代码中看到的那样,它应该已经被编码为该数据类型。

错误信息如下:

Traceback (most recent call last): File "C:\Users\olive\OneDrive\Dokumenter\Files\skole docs\Programering\test\Fixornot.py", line 37, in logreg()

File "C:\Users\olive\OneDrive\Dokumenter\Files\skole docs\Programering\test\Fixornot.py", line 29, in logreg login(logname, logpass)

File "C:\Users\olive\OneDrive\Dokumenter\Files\skole docs\Programering\test\Fixornot.py", line 20, in login bcrypt.checkpw(logpass, hashed)

File "C:\Users\olive\AppData\Local\Programs\Python\Python39\lib\site-packages\bcrypt_init_.py", line 120, in checkpw raise TypeError("Unicode-objects must be encoded before checking")

TypeError: Unicode-objects must be encoded before checking

这是代码 (github):

import bcrypt
import hashlib
LR = None

salt = bcrypt.gensalt()

def register ():
    print('Making a user')
    user = input('Navn: ')
    hashed = bcrypt.hashpw(input('password: ').encode('utf-8'), salt)
    file = open('user_details.txt','a')
    file.write(user + ',' + str(hashed) + ',' + str(salt) + '\n')
    file.close()
    logreg()

def login (logname, logpass):
    file = open('user_details.txt','r')
    for i in file:
        user, hashed, salt = i.split(',')
    bcrypt.checkpw(logpass, hashed)
    file.close()

def logreg():
    loginregist = input('log/reg? ')
    if loginregist == 'log':
        print('Du er ved at logge ind')
        logname = input('Navn: ')
        logpass = bcrypt.hashpw(input('password: ').encode('utf-8'), salt)
        login(logname, logpass)
    elif loginregist == 'reg':
        register()
    else:
        logreg()



logreg()

要修复您的错误:在 Github 页面的第 17 行,将模式从 'r' 更改为 'rb'。如果你使用前者(作为例子)

with open("blankpaper.txt", 'r') as f:
    for line in f:
        print(type(line))

你会看到line的类型是<class 'str'>。如果你把这段代码中的'r'换成'rb',你会看到line的类型是<class 'bytes'>,这就是你想要的

在第 19 行中,将 ',' 更改为 b',',因为 i 是一个 bytes 对象。

进行这些更改后,您不应再获得

TypeError: Unicode-objects must be encoded before checking

但是,您的代码中还有其他地方可能会产生错误。

我们知道我们需要使用 bytes 对象,但是有几个地方使用了 unicode 字符串,而应该使用 bytes 字符串。

改变

user = input('Navn: ')

user = input('Navn: ').encode()

改变这两行

file = open('user_details.txt','a')
file.write(user + ',' + str(hashed) + ',' + str(salt) + '\n')

file = open('user_details.txt','ab')
file.write(user + b',' + hashed + b',' + salt + b'\n')

进行这些更改后,我能够成功 运行 一个会话,在该会话中我注册了我的用户名和密码,然后登录。没有错误。

如有任何问题,请告诉我。希望对您有所帮助!