尝试使用hmac https://docs.python.org/3/library/hmac.html#hmac.new模块而不是hashlib
module:
import hmac
import hashlib
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
total_params = b"/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY"
signature = hmac.new(secret_key, total_params, hashlib.sha256).hexdigest()
print("signature = {0}".format(signature))
这给出了期望的结果:
signature = 30f678a157230290e00475cfffccbc92ae3659d94c145a2c0e9d0fa28f41c11a
Edit
请注意,hmac
模块接受密钥和消息的字节。如果您的输入是字符串,则可以使用str.encode() https://docs.python.org/3/library/stdtypes.html#str.encode具有相关字符集的方法,例如'ascii'
, 'utf-8
' (默认),etc. https://docs.python.org/3/library/codecs.html#standard-encodings
在上面的代码示例中我使用的是字节文字 https://docs.python.org/3/library/stdtypes.html#bytes-objects引入于PEP-3112 https://peps.python.org/pep-3112/。字节文字只能包含 ASCII 字符,任何超出 ASCII 范围的字符都必须作为相关转义序列输入。
例如:
emoji = b'\xf0\x9f\x98\x84'
print(emoji.decode('utf-8'))
因此,上面代码示例中的以下行...
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
...相当于:
secret_key = "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j".encode('ascii')