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
。
我知道 bcrypt
的 checkpw()
仅将 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')
进行这些更改后,我能够成功 运行 一个会话,在该会话中我注册了我的用户名和密码,然后登录。没有错误。
如有任何问题,请告诉我。希望对您有所帮助!
我正在尝试使用 bcrypt
(Python) 创建一个安全的登录系统。
现在我得到的错误是 TypeError: Unicode-objects must be encoded before checking
。
我知道 bcrypt
的 checkpw()
仅将 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')
进行这些更改后,我能够成功 运行 一个会话,在该会话中我注册了我的用户名和密码,然后登录。没有错误。
如有任何问题,请告诉我。希望对您有所帮助!