Проблема с созданием хэша HMAC-SHA1 в Python

У меня проблемы с созданием подписи (в формате хэша HMAC-SHA1), я продолжаю получать ошибку TypeError.

Я использую следующий код для создания подписи:

from hashlib import sha1
import hmac
import binascii
def getUrl(request):
    devId = 2
    key = '7car2d2b-7527-14e1-8975-06cf1059afe0'
    request = request + ('&' if ('?' in request) else '?')
    raw = request+'devid={0}'.format(devId)
    hashed = hmac.new(key, raw, sha1)
    signature = hashed.hexdigest()
    return 'http://api.domain.com'+raw+'&signature={1}'.format(devId, signature)
print(getUrl('/v2/healthcheck'))

Ошибка, которую я продолжаю получать:

Traceback (most recent call last):
  File "C:\Users\...\Documents\serviceinfo\sig.py", line 12, in <module>
    print(getUrl('/v2/healthcheck'))
  File "C:\Users\...\Documents\serviceinfo\sig.py", line 9, in getUrl
    hashed = hmac.new(key, raw, sha1)
  File "C:\Users\...\AppData\Local\Programs\Python\Python37-32\lib\hmac.py", line 153, in new
    return HMAC(key, msg, digestmod)
  File "C:\Users\...\AppData\Local\Programs\Python\Python37-32\lib\hmac.py", line 49, in __init__
    raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
TypeError: key: expected bytes or bytearray, but got 'str'
[Finished in 0.1s with exit code 1]

Кто-нибудь может указать мне в правильном направлении? Заранее спасибо!


person Matt    schedule 08.11.2019    source источник


Ответы (1)


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

key=bytes(str('7car2d2b-7527-14e1-8975-06cf1059afe0'),'utf8')

а затем дайте ключ объекту hamc.new

Или

вы можете использовать функцию bytearray вместо байтов

key=bytearray(str('7car2d2b-7527-14e1-8975-06cf1059afe0'), 'utf-8')

а затем дайте ключ объекту hamc.new

person AmilaMGunawardana    schedule 08.11.2019
comment
Спасибо. Я пробовал оба варианта и получаю новую ошибку: TypeError: Unicode-объекты должны быть закодированы перед хешированием. Любые идеи? - person Matt; 08.11.2019
comment
Привет @Matt У тебя есть ответ? - person AmilaMGunawardana; 09.11.2019