Python hashlib и decode() для объекта Bytes

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

UnicodeDecodeError: кодек utf-8 не может декодировать байт 0xad в позиции 1: недопустимый начальный байт

Вот мой тестовый код, который выдает эту ошибку. Ошибка в строке 8 (h2 = h.decode('utf-8'))

import hashlib

pw = 'wh@teV)r'
salt = 'b7u2qw^T&^#U@Lta)hvx7ivRoxr^tDyua'
pwd = pw + salt
h = hashlib.sha512(pwd.encode('utf-8')).digest()
print(h)
h2 = h.decode('utf-8')
print(h2)

Если я не хеширую его, он отлично работает...

>>> pw = 'wh@teV)r'
>>> salt = 'b7u2qw^T&^#U@Lta)hvx7ivRoxr^tDyua'
>>> pwd = pw + salt
>>> h = pwd.encode('utf-8')
>>> print(h)
b'wh@teV)rb7u2qw^T&^#U@Lta)hvx7ivRoxr^tDyua'
>>> h2 = h.decode('utf-8')
>>> print(h2)
wh@teV)rb7u2qw^T&^#U@Lta)hvx7ivRoxr^tDyua

Итак, я предполагаю, что я чего-то не понимаю в хеше, но я понятия не имею, что мне не хватает.


person Zamphatta    schedule 16.08.2012    source источник
comment
хэши - это строки байтов, они не являются текстом, вы не можете их расшифровать. Возможно, вы действительно хотите использовать .hexdigest(), если вам нужна текстовая форма хеша?   -  person gps    schedule 17.08.2012


Ответы (1)


Во втором примере вы просто кодируете в UTF-8, а затем сразу декодируете результат.

С другой стороны, в первом примере вы кодируете в UTF-8, возитесь с байтами, а затем пытаетесь декодировать его, как будто это все еще UTF-8. Допустимы ли результирующие байты в качестве UTF-8, чисто случайно (и даже если они все еще действительны в UTF-8, строка Unicode, которую она представляет, не будет иметь никакого отношения к исходной строке).

person MRAB    schedule 16.08.2012