在Python中进行HMAC签名请求

9 投票
1 回答
9276 浏览
提问于 2025-04-18 11:10

我正在尝试用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 个回答

16

你需要传入一个指向 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'

撰写回答