У меня есть код ниже в документации по Java (он принимает secret_key
и data
в качестве входных данных):
javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1")
mac.init(new javax.crypto.spec.SecretKeySpec(secret_key.getBytes(), "HmacSHA1"))
byte[] hexBytes = new org.apache.commons.codec.binary.Hex().encode(mac.doFinal(data.getBytes()))
String signature = new String(hexBytes, "UTF-8")
после выполнения некоторого RnD онлайн я написал эквивалентный python:
decodedKey = secret_key.decode("hex")
hmac_val = hmac.new(decodedKey, data.encode('UTF-8'), hashlib.sha1)
signature = hmac_val.digest().encode('base64')
но при выполнении почтового запроса с этим значением подписи в заголовке я получаю
ValueError: Недопустимое значение заголовка «XXXXXXXXXXXX»
мой эквивалент python правильный? было бы здорово помочь, если бы кто-то мог объяснить!
ИЗМЕНИТЬ
Джава
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
String secret_key = "c84766ca4a3ce52c3602bbf02ad1f7";
String data = "some data";
javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1");
mac.init(new javax.crypto.spec.SecretKeySpec(secret_key.getBytes(), "HmacSHA1"));
byte[] hexBytes = new org.apache.commons.codec.binary.Hex().encode(mac.doFinal(data.getBytes()));
String signature = new String(hexBytes, "UTF-8");
System.out.println("signature : "+signature);
}
п/п
signature : 2b565c0476eed0f350ddb3a2852a4cab91281bdc
Питон:
In [1]: import hmac
In [2]: import hashlib
In [3]: secret_key = "c84766ca4a3ce52c3602bbf02ad1f7"
In [4]: data = "some data"
In [5]: decodedKey = secret_key.decode("hex")
In [6]: hmac_val = hmac.new(decodedKey, data.encode('UTF-8'), hashlib.sha1)
In [7]: signature = hmac_val.digest().encode('base64')
In [8]: signature
Out[8]: '3qE5SqSdvBEJcy8mSF+srqNXCd4=\n'
In [9]: