Python中的HMAC签名请求

8
我正在尝试使用Python 3.4和requests库创建HMAC-SHA512签名请求,以进行API调用。我试图遵循文档,但出现了错误:
AttributeError: '_hashlib.HASH' object has no attribute 'new'

这里有一些代码。在hmac构造函数上出现错误。如果我尝试传递hashlib.md5()或完全省略digest参数,也是可以的。
我不确定后面是否正确签名请求,因为我还没有做到那一步。我正在尝试使用的服务文档说要使用我的秘密来签署URL。我需要这个变成字节串才能运行。
import hmac
import hashlib
import requests

secret = b'mysecret'
url = b'http://someurl.com/something/'

signing = hmac.new(secret, url, hashlib.sha512())

headers = {'apisign': signing.digest()}
response = requests.get(url, headers=headers)

非常感谢您的提问。这里是一些指针,希望对您有所帮助。很抱歉没有找到相关示例。谢谢!

1个回答

15

你必须传入对 hashlib.sha512 可调用对象的引用,而不是调用它后的结果:

signing = hmac.new(secret, url, hashlib.sha512)

或者,你可以直接使用字符串'sha512'

signing = hmac.new(secret, url, 'sha512')

并且将使用hashlib.new()构造哈希对象。

演示:

>>> import hashlib
>>> import hmac
>>> secret = b'mysecret'
>>> url = b'http://someurl.com/something/'
>>> signing = hmac.new(secret, url, hashlib.sha512)
>>> signing.digest()
b'!~s2\x97\x97\xa9\xcc\xefcb\xa8\xcc\xa7\xbc\xec\xe5\xfc\xc3\xac\xfc\xbc5]\x05\x96\xc7\x83\x8b\x1b\x90\xd3\xa5\xca\x8cLsC\x17\xa0\xea\xa3\xfe\xd8M\xfda\x1epj\x90\xff}\xfa\xc2@\x92\xfb\xee\xa8\xab\x1b\x08\x8e'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接