首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python :Unicode-对象必须在检查之前进行编码。

Python :Unicode-对象必须在检查之前进行编码。
EN

Stack Overflow用户
提问于 2022-04-08 07:33:29
回答 1查看 130关注 0票数 -1

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

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

以下是错误消息:

回溯(最近一次调用):"C:\Users\olive\OneDrive\Dokumenter\Files\skole docs\Programering\test\Fixornot.py文件,第37行,在logreg()中 文件"C:\Users\olive\OneDrive\Dokumenter\Files\skole docs\Programering\test\Fixornot.py",第29行,在logreg登录(logname,logpass) 文件"C:\Users\olive\OneDrive\Dokumenter\Files\skole docs\Programering\test\Fixornot.py",第20行,登录bcrypt.checkpw(logpass,散列) 文件"C:\Users\olive\AppData\Local\Programs\Python\Python39\lib\site-packages\bcrypt_init_.py",第120行,在checkpw中引发TypeError(“Unicode-对象必须在检查前编码”) TypeError: Unicode-对象必须在检查前进行编码

下面是代码(github):

代码语言:javascript
代码运行次数:0
运行
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-08 07:58:09

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

代码语言:javascript
代码运行次数:0
运行
复制
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对象。

在做出这些改变之后,你就不应该再做这些改变了

代码语言:javascript
代码运行次数:0
运行
复制
TypeError: Unicode-objects must be encoded before checking

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

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

变化

代码语言:javascript
代码运行次数:0
运行
复制
user = input('Navn: ')

代码语言:javascript
代码运行次数:0
运行
复制
user = input('Navn: ').encode()

更改这两行

代码语言:javascript
代码运行次数:0
运行
复制
file = open('user_details.txt','a')
file.write(user + ',' + str(hashed) + ',' + str(salt) + '\n')

代码语言:javascript
代码运行次数:0
运行
复制
file = open('user_details.txt','ab')
file.write(user + b',' + hashed + b',' + salt + b'\n')

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

如果有什么问题,请告诉我。我希望这能帮到你!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71793270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档