2016-03-29 6 views
0

Ich versuche derzeit, einen Aufruf der Royal Mail API mit NodeJs und SOAP zu implementieren; Ich habe Schwierigkeiten, nach einem Beispiel Python-SkriptDifferent Sha1 Ergebnis zwischen Node & Python

Der Python-Skript, um die Sicherheit Header Implementierung neu zu erstellen, wie

folgt
#!/usr/local/bin/python2.7 
import os 
import sha 
import binascii 
import base64 

password = 'test' 
CREATIONDATE = '2016-03-29T14:03:46Z' 
nonce = '7715776714' 
HASH = sha.new(password).digest() 
BASE64PASSWORD = base64.b64encode(HASH) 

digest = sha.new(nonce + CREATIONDATE + HASH).digest() 


PASSWORDDIGEST = base64.b64encode(digest) 
ENCODEDNONCE = base64.b64encode(nonce) 

print 'NONCE = ', nonce 
print 'BASE64PASSWORD', BASE64PASSWORD 
print 'PASSWORDDIGEST ', PASSWORDDIGEST 
print 'ENCODEDNONCE ', ENCODEDNONCE 
print 'CREATIONDATE ', CREATIONDATE 

Welche Ausgänge:

NONCE 7715776714 
BASE64PASSWORD qUqP5cyxm6YcTAhz05Hph5gvu9M= 
PASSWORDDIGEST coDzcnSZObFfrM0FY33GcfxjOj4= 
ENCODEDNONCE NzcxNTc3NjcxNA== 
CREATIONDATE 2016-03-29T14:03:46Z 

Ich habe neu erstellt diese mit NodeJs, aber ich scheine eine andere Ausgabe zu bekommen - die Eingabe des korrekten Passworts in der Python-Version und die Verwendung der resultierenden Daten erlauben es mir einen gültigen Aufruf an die API zu machen, die Ausgabe von NodeJs gibt mir einen Autorisierungsfehler

Knoten Js-Code

var createdDate, password = 'test', nonce; 
createdDate = '2016-03-29T14:03:46Z'; 
nonce = '7715776714'; 

var crypto = require("crypto"), 
passHash = crypto.createHash('sha1'), 
digestHash = crypto.createHash('sha1'); 

passHash.update(password); 

var HASH = passHash.digest(); 
console.log('NONCE ' + nonce) 
console.log('BASE64PASSWORD ' + base64_encode_string(HASH)) 

digestHash.update(nonce + createdDate + HASH); 
var digest = digestHash.digest(); 

var PASSWORDDIGEST = base64_encode_string(digest); 
console.log('PASSWORDDIGEST ' + PASSWORDDIGEST); 
var ENCODEDNONCE = base64_encode_string(nonce.toString()); 

console.log('ENCODEDNONCE ' + ENCODEDNONCE); 
console.log('CREATIONDATE ' + createdDate); 

Welche

gibt
NONCE 7715776714 
BASE64PASSWORD qUqP5cyxm6YcTAhz05Hph5gvu9M= 
PASSWORDDIGEST FRMDpkDOi1j9KB/sDHg1b7BYQgA= 
ENCODEDNONCE NzcxNTc3NjcxNA== 
CREATIONDATE 2016-03-29T14:03:46Z 

Es scheint, dass die Sha für die HASH identisch ist, aber der zweite Sha (verdauen) verursacht einen abweichenden Ergebnis in der NodeJS Version. Irgendwelche Hinweise darauf, wo ich falsch liege?

Als Referenz Ich verwende sha Bibliothek in Python und Krypto in NodeJS

+0

'sha'-Modul ist veraltet, es könnte sinnvoll sein,' hoshlib' statt –

Antwort

0

Ein Problem ist, dass Sie implizit die HASH Buffer auf einen UTF-8-String sind Umwandlung, die geeignet ist beschädigt Ausgang zu verursachen, wenn binäre Umwandlung zu UTF-8. Stattdessen können Sie .update() mehrmals aufrufen und die binären Daten in HASH erhalten:

digestHash.update(nonce + createdDate); 
digestHash.update(HASH); 
var digest = digestHash.digest(); 

auf einem nicht verwandten Notiz, brauchen Sie nicht base64_encode_string() für Puffer, wie für diejenigen, können Sie einfach buffer.toString('base64') (z HASH.toString('base64')) tun.

+0

zu verwenden. Das hat es gelohnt, danke! – ossie

Verwandte Themen