2015-06-22 3 views
2

с:OpenSSL HMAC отличаются от питона HMAC

KEY='7vgd39eyxald9sucClM7' 
DATA='POST\nmultipart/form-data\nWed, 10 Jun 2015 07:27:43 GMT\n/1/classes/item\nx-wbs-uid:f886a495220975d724ff3679a5cc9cef04343076' 

в командной строке

HASH_BIN=`echo -n "$DATA" | openssl dgst -sha256 -mac HMAC -macopt key:$KEY -binary` 
openssl enc -e -base64 <<< $HASH_BIN 
result: VmBdzRcNg0OJZVVLSgg1zcViflug9iqtb6Gsnjqf9F8K 

в питона

import hmac, hashlib, base64 
hash = hmac.new(KEY, DATA, hashlib.sha256).digest() 
base64.encodestring(hash).strip() 
result: u6Poj7Jqrz6+wvXDNyK88pVm5iKUF6RUmq2P2LtHmuE= 

Может кто-то мне помочь ??? Большое спасибо.

+0

Могли бы вы вставить весь код Python, включая KEY и определение DATA? –

+0

Хороший вопрос. Я сделал эксперименты и нашел ту же проблему, что и вы. Когда я пытался использовать другую и более простую строку DATA (без «\ n»), openssl и python могут дать тот же результат. Поэтому я обнаружил, что проблема вызвана определением строки в python. –

ответ

2

Это должно быть вызвано определением строки DATA в вашем коде python.

Вам нужно добавить r для лечения DATA в качестве сырья строки, такие как

DATA=r'POST\nmultipart/form-data\nWed, 10 Jun 2015 07:27:43 GMT\n/1/classes...' 

С r, все управляющие коды в DATA будут игнорироваться. То есть «\ n» будет рассматриваться как символ новой строки, но r '\ n' будет рассматриваться как символы \ с последующим n. В Python,

'\n' // 0x0d 

r'\n' // 0x5c 0x6e 

С r, он будет выводить результат равен выходу через OpenSSL,

VmBdzRcNg0OJZVVLSgg1zcViflug9iqtb6Gsnjqf9F8K 
Смежные вопросы