Как привести дайджест HASHLIB к массиву в python? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь сравнить результат дайджеста SHA1 с инициализированным массивом.

Но при сравнении первого байта возвращается, что они не равны, а при печати первого байта дайджест, он такой же, как первый байт в моем инициализированном массиве.

Должен ли я его как-то привести?

import hashlib


my_digest = [0x7,0x3,0x8,0x2,0x2,0x5,0x6,0xa,0xb,0xb,0x3,0xe,0xe,0xa,0x3,0x2,0x5,0xf,0x9,0xa,0xd,0xe,0x1,0xc,0xc,0x0,0x4,0xe,0x4,0x9,0x3,0x3,0xe,0xe,0x8,0x1,0x7,0xc,0xd,0x3]
digest = hashlib.sha1(b"im a very good speaker").hexdigest()
# digest = 7382256abb3eea325f9ade1cc04e4933ee817cd3

if(digest[0] == my_digest[0]):
    print("correct")
else:
    print("not correct")
print(digest)

вывод:

not correct
7382256abb3eea325f9ade1cc04e4933ee817cd3

print(digest[0]) возврат 7

Ответы [ 3 ]

1 голос
/ 01 мая 2020

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

>>> my_digest = [0x73, 0x82, 0x25, 0x6a, 0xbb, 0x3e, 0xea, 0x32, 0x5f, 0x9a, 0xde, 0x1c, 0xc0, 0x4e, 0x49, 0x33, 0xee, 0x81, 0x7c, 0xd3]

Во-вторых, вы хотите, чтобы digest() вместо hexdigest() было получено необработанные байты ha sh:

>>> digest = hashlib.sha1(b"im a very good speaker").digest()

Наконец, преобразуйте его в список перед сравнением:

>>> list(digest) == my_digest
True
0 голосов
/ 01 мая 2020

Проблема с type. Вы сравниваете строку с int. Смотрите ниже для возможного исправления.

import hashlib

my_digest = [0x7,0x3,0x8,0x2,0x2,0x5,0x6,0xa,0xb,0xb,0x3,0xe,0xe,0xa,0x3,0x2,0x5,0xf,0x9,0xa,0xd,0xe,0x1,0xc,0xc,0x0,0x4,0xe,0x4,0x9,0x3,0x3,0xe,0xe,0x8,0x1,0x7,0xc,0xd,0x3]
digest = hashlib.sha1(b"im a very good speaker").hexdigest()
# digest = 7382256abb3eea325f9ade1cc04e4933ee817cd3

print("digest[0]", type(digest[0]))
print("my_digest[0]", type(my_digest[0]))

if(int(digest[0]) == my_digest[0]):
    print("correct")
else:
    print("not correct")
print(digest)
0 голосов
/ 01 мая 2020

В Python 3 , с вашим кодом вы сравниваете str с int, и хотя это можно сделать, он не будет пытаться интерпретировать содержимое строки, поэтому '7' != 7.

Один из способов обойти это - приведение ваш int к str, например:

if digest[0] == str(my_digest[0]):
...