2016-07-31 1 views
1

J'essaie de porter un script Python sur Node et je suis bloqué sur les hachages SHA1.Port du condensé de hachage python au noeud js

Le code Python suivant:

import hashlib 

user = 'test' 

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

Imprime:

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

je besoin d'un hachage SHA1 dans ce format dans le nœud. Ce Javascript:

var crypto = require('crypto'); 

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

impressions

©Jå̱sÓé/»Ó 

Comment puis-je obtenir nœud pour produire la sortie dans le même style que Python fait? Ce n'est clairement pas binaire ou hexadécimal, dans quel format est la sortie de python?

+0

La sortie Python est une chaîne d'octets, qui utilise ASCII pour représenter les octets dans la plage ASCII 7 bits imprimable et les codes d'échappement hexadécimaux pour les autres valeurs d'octet. En hexadécimal, il ressemble à 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'. La sortie JavaScript est le codage Latin-1 de ces octets. –

+0

Vous voyez deux représentation différente des mêmes données '\ xa9' est' © 'dans le codage iso-8859-1. Votre deuxième chaîne semble juste tronquée. –

+0

python est bien, et c'est une chaîne binaire exacte, la sortie nodejs est convertie en non binaire lorsque vous utilisez console.log – YOU

Répondre

2

Les deux résultats sont déjà les mêmes. La représentation en chaîne des octets (ce que vous voyez sur la console) diffère en JavaScript et en Python. Pour prouver qu'ils sont identiques, convertir à la fois à une liste d'entier:

> 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] 

Même résultat en 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] 

Vous pouvez utiliser hexdigest/digest('hex') pour obtenir une chaîne hexadécimale ('a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'), qui peut être plus facile à gérer.

Mais il n'y a rien de mal avec les octets; encore une fois, c'est juste la représentation de la chaîne qui est différente. Par exemple, si vous écrivez les deux octets dans un fichier, les deux fichiers seront totalement identiques.

+0

Merci, mon problème doit se trouver ailleurs. Je communique un serveur qui a besoin d'un hachage sha1 et il ne m'authentifie pas, donc je dois envoyer les données erronées. –

+0

Oui, cela semble probable. Si tout le reste échoue, comparez les vidages pcap pour voir quels octets sont différents. – phihag