Реализация SHA1-HMAC с Python - PullRequest
       43

Реализация SHA1-HMAC с Python

0 голосов
/ 26 сентября 2018

Я реализую генерацию SHA1-HMAC для python (v 3.7), чтобы иметь возможность создавать код HMAC.

Я использовал сетевой генератор для создания SHA1-HMAC со следующимданные:

  • строка: '123'
  • Секретный ключ: 'secret'
  • Алгоритм дайджеста: SHA1

Iя получаю этот результат:

b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7

Однако, когда я пытаюсь сделать то же самое с Python, я получаю разные результаты, которые являются неправильными.

import hashlib
import hmac
import base64

def make_digest(message, key):
    key = bytes(key, 'UTF-8')
    message = bytes(message, 'UTF-8')

    digester = hmac.new(key, message, hashlib.sha1)
    signature1 = digester.digest()

    signature2 = base64.urlsafe_b64encode(signature1)    
    return str(signature2, 'UTF-8')


result = make_digest('123', 'secret')
print(result)

Этот код дает результат:

sU6S6xf2t47FogXuDhqyIPt_htc=

Что может быть не так с этим кодом?

1 Ответ

0 голосов
/ 26 сентября 2018

Вы не должны использовать Base64 здесь.Сайт, на который вы ссылаетесь, дает вам шестнадцатеричные значения байтов дайджеста.Используйте метод HMAC.hexdigest() , чтобы получить то же значение в шестнадцатеричном формате в Python:

>>> key = b'secret'
>>> message = b'123'
>>> digester = hmac.new(key, message, hashlib.sha1)
>>> digester.hexdigest()
'b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7'

иначе, ваш код выводит правильное значение, но в виде данных в кодировке Base64:

>>> digester.digest()
b'\xb1N\x92\xeb\x17\xf6\xb7\x8e\xc5\xa2\x05\xee\x0e\x1a\xb2 \xfb\x7f\x86\xd7'
>>> base64.urlsafe_b64encode(digester.digest())
b'sU6S6xf2t47FogXuDhqyIPt_htc='

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

>>> bytes.fromhex('b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7')
b'\xb1N\x92\xeb\x17\xf6\xb7\x8e\xc5\xa2\x05\xee\x0e\x1a\xb2 \xfb\x7f\x86\xd7'
>>> base64.urlsafe_b64encode(bytes.fromhex('b14e92eb17f6b78ec5a205ee0e1ab220fb7f86d7'))
b'sU6S6xf2t47FogXuDhqyIPt_htc='
...