java эквивалентен python для хеширования

У меня есть код ниже в документации по 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]:

person NoobEditor    schedule 17.02.2016    source источник
comment
ошибаться свойственно человеку, чтобы прощать божественному :)   -  person NoobEditor    schedule 17.02.2016
comment
Опубликуйте фактический вывод из двух.   -  person chrylis -cautiouslyoptimistic-    schedule 17.02.2016
comment
Мое первое предположение заключается в том, что данные, которые вы хешируете, не представлены одинаково на обеих платформах. Подайте каждому идентичную предварительно сгенерированную последовательность байтов.   -  person chrylis -cautiouslyoptimistic-    schedule 17.02.2016
comment
@chrylis: добавлено редактирование, смотрите   -  person NoobEditor    schedule 17.02.2016


Ответы (3)


Ссылаясь на эту тему:

метод Java который может предоставить тот же результат, что и метод Python для HMAC-SHA256 в шестнадцатеричном формате

небольшая настройка для sha1, ниже приведен простой эквивалент:

In [13]: print hmac.new(secret_key, data, hashlib.sha1).hexdigest()
2b565c0476eed0f350ddb3a2852a4cab91281bdc
person NoobEditor    schedule 17.02.2016

pycrypto имеет хеш-функцию https://pypi.python.org/pypi/pycrypto

из-за ValueError: Invalid header value 'XXXXXXXXXX' см. этот поток ValueError: Неверное значение заголовка 'H2O Python client/2.7.9 (по умолчанию, 2 апреля 2015 г., 15:33:21) \n[GCC 4.9.2] '

возможно, заголовок в вашем сообщении несовместим с библиотекой, которую вы используете для сообщения

какие библиотеки вы импортируете в код python?

person ralf htp    schedule 17.02.2016
comment
чтобы получить тот же результат, алгоритмы должны быть равны до битового уровня (порядок следования байтов и т. д.). Обычно вы можете использовать отладчик (pdb, jdb), чтобы выполнить каждую операцию в алгоритме и посмотреть, разница возникает. См. этот поток для исходного кода для javax.crypto stackoverflow.com/questions/18181023/ (java всегда имеет обратный порядок байтов) - person ralf htp; 17.02.2016
comment
зачем мне использовать какой-то другой язык в моей программе, если та же функция присутствует в моем языке? - person NoobEditor; 17.02.2016

если вы хотите, чтобы это было легко, попробуйте это: https://pythonhosted.org/pycrypto/Crypto.Hash.HMAC-module.html

возможно кодировка влияет на результат, [UTF-8] то [base-64]

person ralf htp    schedule 17.02.2016
comment
получение ec0e4e884b0056d817efb56ab5920509 в качестве вывода, так что это неправильно, также почему бы не отредактировать существующий ответ, а не публиковать новый? - person NoobEditor; 17.02.2016