Невозможно закодировать sha1 в hex, используя hashlib в python3 - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь закодировать строку sha1 в hex, используя hashlib в python3.Я получаю ошибку атрибута.

Программа успешно работает на python2.

gesture = file.read(hashlib.sha1().digest_size).encode('hex')
AttributeError: 'bytes' object has no attribute 'encode'

Файл: ???ӷJ?*L??R?????T% (Это несолёный хэш-код SHA1)

Файл при чтении в двоичном режиме: b'\xae\x93\xf0\xd3\xb7\x7fJ\xb4*L\x90\xdeR\x91\xa8\xa1\x9b\xb6T\x0f'

Я открываю егов режиме rb

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Вы можете сделать это:

with open("your_file", "rb") as f:
    Hash = f.read(hashlib.sha1().digest_size).hex()

Здесь hex - это метод класса bytes.

1 голос
/ 06 апреля 2019

У самого хэша будет метод hexdigest, который даст желаемый результат. Но код, который вы опубликовали, похоже, пытается применить метод к возвращаемому значению file.read(), а не к объекту дайджеста. Я предполагаю, что вы, вероятно, имеете в виду что-то вроде

sha = hashlib.sha1()
buffer = file.read(sha.digest_size)
sha.update(buffer)
gesture = sha.hexdigest()

Попытка использовать размер дайджеста для указания количества байтов для чтения также является подозрительной. Обычно вы должны прочитать весь файл независимо от его размера; digest.size - это длина вывода из алгоритма SHA1, а не его ввода.

Более обычный способ сделать это будет

with open(filename, 'rb') as f:
    sha = hashlib(f.read())
gesture = sha.hexdigest()

Если ваша цель - прочитать двоичное представление хэша SHA1 обратно в память, hashlib не поддерживает это напрямую. Хеш-алгоритмы, как правило, предназначены для того, чтобы сделать невозможным или, по крайней мере, чрезвычайно ресурсоемким восстановление исходного объекта только из дайджеста; но, конечно, если вы сохраните объект hashlib с pickle или аналогичным, вы сможете прочитать его обратно и в основном продолжить с того места, на котором остановились (хотя я считаю, что могут быть проблемы с переносом солений между некоторыми версиями Python ).

Если вам нужно шестнадцатеричное представление последовательности байтов, это Как правильно преобразовать байты в шестнадцатеричную строку в Python 3?

with open(filename, 'rb') as f:
    buffer = f.read()
hexbytes = buffer.hex()
...