2016-07-31 15 views
1

Ich versuche, ein Python-Skript auf Knoten portieren und ich habe auf SHA1 Hashes festgefahren.Portierung Python-Hash-Digest zu Knoten js

Das folgende Python-Code:

import hashlib 

user = 'test' 

ret = hashlib.sha1(user.encode('utf-8')).digest() 
print(ret); 

Druckt:

b'\xa9J\x8f\xe5\xcc\xb1\x9b\xa6\x1cL\x08s\xd3\x91\xe9\x87\x98/\xbb\xd3' 

Ich brauche einen SHA1-Hash in diesem Format in Knoten. Diese Javascript:

var crypto = require('crypto'); 

var generator = crypto.createHash('sha1'); 
generator.update(new Buffer('test')); 
console.log(generator.digest('binary')); 

druckt

©Jå̱sÓé/»Ó 

Wie kann ich Knoten die Ausgabe im gleichen Stil zu produzieren erhalten, wie Python tut? Es ist eindeutig nicht binär oder hex, welches Format hat die Python-Ausgabe?

+0

Die Python-Ausgabe ist eine Bytezeichenfolge, die ASCII für die Darstellung von Bytes im druckbaren 7-Bit-ASCII-Bereich und Hex-Escape-Codes für andere Bytewerte verwendet. In hex sieht es aus wie 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'. Die JavaScript-Ausgabe ist die Latin-1-Codierung dieser Bytes. –

+0

Sie sehen zwei verschiedene Darstellungen der gleichen Daten '\ xa9' ist' © 'in ISO-8859-1-Codierung. Ihre zweite Zeichenfolge scheint nur abgeschnitten zu sein. –

+0

Python ist in Ordnung, und es ist eine exakte binäre Zeichenfolge, Nodejs Ausgabe wird in nicht binäre konvertiert, wenn Sie console.log verwenden – YOU

Antwort

2

Beide Ergebnisse sind bereits gleich. Die Zeichenfolgendarstellung von Bytes (das Zeug, das Sie auf der Konsole sehen) unterscheidet sich jedoch in JavaScript und Python. Um zu beweisen, dass sie identisch sind, konvertieren beide in eine Integer-Liste:

> var crypto = require('crypto'); 
> var generator = crypto.createHash('sha1'); 
> generator.update(new Buffer('test')); 
> var digest = generator.digest('binary'); 
> var lst = []; 
> for (let i = 0;i < digest.length;i++) st.push(digest.charCodeAt(i)); 
> console.log(JSON.stringify(lst)); 
[169,74,143,229,204,177,155,166,28,76,8,115,211,145,233,135,152,47,187,211] 

gleiches Ergebnis in Python:

>>> import hashlib, base64 
>>> ret = hashlib.sha1('test'.encode('utf-8')).digest() 
>>> print(list(ret)) 
[169, 74, 143, 229, 204, 177, 155, 166, 28, 76, 8, 115, 211, 145, 233, 135, 152, 47, 187, 211] 

Sie hexdigest/digest('hex') können eine hexadezimale Zeichenfolge ('a94a8fe5ccb19ba61c4c0873d391e987982fbbd3') zu erhalten, die möglicherweise einfacher zu handhaben.

Aber es ist nichts falsch mit den Bytes; wieder ist es nur die String-Darstellung, die anders ist. Wenn Sie beispielsweise beide Bytes in eine Datei schreiben, sind beide Dateien vollständig identisch.

+0

Danke, mein Problem muss woanders liegen. Ich kommuniziere einen Server, der einen sha1-Hash benötigt, und er authentifiziert mich nicht, deshalb muss ich die Daten falsch senden. –

+0

Ja, das klingt wahrscheinlich. Wenn alles andere fehlschlägt, vergleichen Sie pcap-Dumps, um zu sehen, welche genauen Bytes sich unterscheiden. – phihag