【问题标题】:Implementing SHA1-HMAC with Python用 Python 实现 SHA1-HMAC
【发布时间】:2018-09-26 13:24:51
【问题描述】:

我正在为 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=

这段代码有什么问题?

【问题讨论】:

    标签: python sha1 hmac


    【解决方案1】:

    你不应该在这里使用 Base64。您链接到的站点会为您提供摘要字节的十六进制值。在 Python 中使用HMAC.hexdigest() method 获得相同的十六进制值:

    >>> 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='
    

    【讨论】:

    • 感谢您的解释。这真的很有帮助。
    猜你喜欢
    • 2012-01-10
    • 2013-05-22
    • 2017-10-04
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多