Reputation: 213
Trying to generate HMAC SHA256 signature for 3Commas, I use the same parameters from the official example, it should generate: "30f678a157230290e00475cfffccbc92ae3659d94c145a2c0e9d0fa28f41c11a"
But I generate: "17a656c7df48fa2db615bfc719627fc94e59265e6af18cc7714694ea5b58a11a"
Here is what I tried:
secretkey = 'NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j'
totalParams = '/public/api/ver1/accounts/new?type=binance&name=binance_account&api_key=XXXXXX&secret=YYYYYY'
print 'signature = '+hashlib.sha256((secretkey+totalParams).encode('ASCII')).hexdigest()
Can anyone help me out?
Upvotes: 21
Views: 34590
Reputation: 1865
I did implement it using a different approach few years ago.
import hmac
import hashlib
import binascii
def create_sha256_signature(key, message):
byte_key = binascii.unhexlify(key)
message = message.encode()
return hmac.new(byte_key, message, hashlib.sha256).hexdigest().upper()
create_sha256_signature("E49756B4C8FAB4E48222A3E7F3B97CC3", "TEST STRING")
https://gist.github.com/gauravvjn/172a4a9933626bd507e00ae6245e33a1
Upvotes: 1
Reputation: 6414
Try using the hmac
module instead of the 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))
This gives the desired result:
signature = 30f678a157230290e00475cfffccbc92ae3659d94c145a2c0e9d0fa28f41c11a
Note that the hmac
module accepts bytes for the key and message. If your inputs are strings, you can use the str.encode()
method with the relevant character set, e.g. 'ascii'
, 'utf-8
' (default), etc.
In the above code example I am using the bytes literal introduced in PEP-3112. A bytes literal can only contain ASCII characters, anything outside of the range of ASCII must be entered as the relevant escape sequences.
For example:
emoji = b'\xf0\x9f\x98\x84'
print(emoji.decode('utf-8'))
Therefore, the following line from the code example above...
secret_key = b"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
...is equivalent to:
secret_key = "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j".encode('ascii')
Upvotes: 40