Почему мне нужно объявить кодировку перед хэшированием в Python, и как я могу это сделать?

Я пытаюсь создать чат-бота, похожего на AI, и одна из его функций - логин. Я использовал код входа в систему раньше, и он отлично работает, но теперь я сталкиваюсь с трудностями с кодом, касающимся хеширования паролей. Вот код:

import hashlib
...
register = input ("Are you a new user? (y/n) >")

password_file = 'passwords.txt'
if register.lower() == "y": 
    newusername = input ("What do you want your username to be? >")
    newpassword = input ("What do you want your password to be? >")

    newpassword = hashlib.sha224(newpassword).hexdigest()

    file = open(password_file, "a")
    file.write("%s,%s\n" % (newusername, newpassword))
    file.close()

elif register.lower() == ("n"):
    username = input ("What is your username? >")
    password = input ("What is your password? >")

    password = hashlib.sha224(password).hexdigest()

    print ("Loading...")
    with open(password_file) as f:
        for line in f:
            real_username, real_password = line.strip('\n').split(',')
            if username == real_username and password == real_password:
                success = True
                print ("Login successful!")
              #Put stuff here! KKC
    if not success:
        print("Incorrect login details.")

И вот результат, который я получаю:

Traceback (most recent call last):
  File "<FOLDERSYSTEM>/main.py", line 36, in <module>
    newpassword = hashlib.sha224(newpassword).hexdigest()
TypeError: Unicode-objects must be encoded before hashing

Я посмотрел кодировку, которую, я думаю, мне следует использовать (latin-1), и нашел нужный синтаксис, добавил, что и я все еще получаю тот же результат.

1 ответ

Решение

Хеширование работает на байтах. str объекты содержат текст Unicode, а не байты, поэтому вы должны сначала кодировать. Выберите кодировку, которая а) может обрабатывать все кодовые точки, с которыми вы, вероятно, столкнетесь, и, возможно, б) другие системы, которые производят те же хеши, также используют.

Если вы единственный пользователь хэшей, просто выберите UTF-8; он может обрабатывать все Unicode и наиболее эффективен для западных текстов:

newpassword = hashlib.sha224(newpassword.encode('utf8')).hexdigest()

Возвращаемое значение из hash.hexdigest() это Юникод str значение, так что вы можете сравнить это с str значения, которые вы читаете из вашего файла.

Другие вопросы по тегам