Как использовать хэш sha256 в Python

Я пытаюсь прочитать в файле паролей. Затем я пытаюсь вычислить хэш для каждого пароля и сравнить его с хэшем, который я уже должен определить, обнаружил ли я пароль. Однако сообщение об ошибке, которое я продолжаю получать, - "TypeError: Unicode-объекты должны быть закодированы перед хэшированием". Вот мой код:

from hashlib import sha256

with open('words','r') as f:
    for line in f:

        hashedWord = sha256(line.rstrip()).hexdigest()

        if hashedWord == 'ca52258a43795ab5c89513f9984b8f3d3d0aa61fb7792ecefe8d90010ee39f2':
            print(line + "is one of the words!")

может кто-нибудь помочь и дать разъяснения?

1 ответов


сообщение об ошибке означает именно то, что оно говорит: У вас есть строка Unicode. Вы не можете SHA-256-хэшировать строку Unicode, вы можете только хэшировать байты.

но почему у вас есть строка Unicode? Поскольку вы открываете файл в текстовом режиме, это означает, что вы неявно просите Python декодировать байты в этом файле (используя кодировку по умолчанию) в Unicode. Если вы хотите получить необработанные байты, вы должны использовать двоичный режим.

другими словами, просто измените это строка:

with open('words','r') as f:

... to:

with open('words', 'rb') as f:

вы можете заметить, что, как только вы это исправите,print строка вызывает исключение. Почему? потому что вы пытаетесь добавить bytes до str. Вам также не хватает места, и вы печатаете не разделенную строку. Вы можете исправить все это, используя два аргумента для print (например,print(line.rstrip(), "is one of the words")).

но тогда вы получите вывод вроде b'\xc3\x85rhus' is one of the words когда вы хотели, чтобы распечатать Århus is one of the words. Это потому что ты сейчас есть байты, а не строки. Поскольку Python больше не декодирует для вас, вам нужно будет сделать это вручную. Чтобы использовать ту же кодировку по умолчанию, которая иногда работает, когда вы не указываете кодировку open, просто позвоните decode без аргументов. Итак:

print(line.rstrip().decode(), "is one of the words")