使用Python实现SHA1-HMAC

时间:2018-09-26 13:24:51

标签: python sha1 hmac

我正在为python(v 3.7)实现SHA1-HMAC生成,以便能够创建HMAC代码。

我已将online generator to create SHA1-HMAC用于以下数据:

  • 字符串:'123'
  • 密钥:'secret'
  • 摘要算法:SHA1

我得到这个结果:

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 :(得分:2)

您不应在此处使用Base64。您链接到的站点为您提供摘要字节的 hex值。使用HMAC.hexdigest() method在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='