Я предлагаю вам заглянуть в Pythons hmac
module , чтобы достичь того, что вы ищете;Функция Pythons hmac.new(...).digest()
более тесно связана с PHP hash_hmac()
, чем то, что вы пробовали с hashlib.sha512()
.
Вот простой строковый тест, который показывает, что они возвращают один и тот же вывод:
Python 3,6
>>> import hmac
>>> hmac.new(''.encode(), 'Hello'.encode(), 'sha512').hexdigest()
'b31d977587ea18dd68bb795d1b79d59ebf8b9aff7648f4f441fc421b05cc2486efe9d5b413ea6828addbca0f60294169ae56435408e0063b5f183afb64f51a5d'
PHP 7,3 (протестировано в сети http://www.writephponline.com/)
print(hash_hmac('sha512', 'Hello', ''));
b31d977587ea18dd68bb795d1b79d59ebf8b9aff7648f4f441fc421b05cc2486efe9d5b413ea6828addbca0f60294169ae56435408e0063b5f183afb64f51a5d
print(hash_hmac('sha512', utf8_encode('Hello'), ''));
b31d977587ea18dd68bb795d1b79d59ebf8b9aff7648f4f441fc421b05cc2486efe9d5b413ea6828addbca0f60294169ae56435408e0063b5f183afb64f51a5d
Теперь, как указал пользователь @decezeв комментарии вы должны учитывать тот факт, что Python-дикты не сортируются, поэтому вы можете иметь непредсказуемый порядок значений при переборе данных, которые вы хотите хешировать / hmac.
Я предлагаю вам определитьсписок с желаемым порядком ключей (или вообще пропустить), может быть так:
import hmac
params={
'shopid': 1234,
'apikey': "HelloTest",
'timestamp': 1554888606,
'salt': "diego",
}
key_list = ['shopid', 'apikey', 'timestamp', 'salt']
tosign = ''.join(str(params[k]) for k in key_list)
# '1234HelloTest1554888606diego'
token = hmac.new(''.encode(), tosign.encode(), 'sha512').hexdigest()
print(token)
# 'b0d45466aa68db7df247d858094f88010b7c58820538309fffe28a42458a6ce4b6b2d48b1c5b9d40492851db075af9d86b2e1c81c4a6960d3dfb4616bccb617a'
Как вы можете видеть, теперь вы получаете тот же вывод hash / hmac, что и в вашем PHPверсия (см. код в вопросе).