7

requests ライブラリを使用して、Python 3.4 で API 呼び出し用の HMAC-SHA512 署名付き要求を作成しようとしています。ドキュメントに従おうとしていますが、このエラーが発生しています:

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)

任意のポインタをいただければ幸いです。例が見つかりませんでした。ありがとう!

4

1 に答える 1

15

hashlib.sha512呼び出しの結果ではなく、callableへの参照を渡す必要があります。

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'
于 2014-06-26T11:29:10.017 に答える