web-dev-qa-db-fra.com

Comment puis-je obtenir le hachage sha1 d'une chaîne dans node.js?

J'essaie de créer un serveur websocket écrit en node.js

Pour que le serveur fonctionne, je dois obtenir le hachage SHA1 d'une chaîne.

Ce que je dois faire est expliqué dans Section 5.2.2, page 35 de la documentation .

NOTE: Par exemple, si la valeur de la "Sec-WebSocket-Key" _ tête dans la poignée de main du client étaient "dGhlIHNhbXBsZSBub25jZQ==", le serveur ajoutera la chaîne "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" pour former la chaîne "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11". Le serveur prend alors le hachage SHA-1 de cette chaîne, donnant la valeur 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x45 0x45 0xb 0xc0 Cette valeur est ensuite codée en base64, pour donner la valeur "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", qui serait retourné dans le "Sec-WebSocket-Accept" entête.

93
Eric

Voir les crypto.createHash() fonction et les fonctions hash.update() et hash.digest() associées :

const crypto = require('crypto')
  , shasum = crypto.createHash('sha1');
shasum.update('foo');
console.log(shasum.digest('hex'));
// "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
215
maerics

Obligatoire: SHA1 est romp, vous pouvez faire une collision avec les crédits AWS de la cohorte d'accélérateurs de démarrage moyenne, mais pour répondre à votre question:

var getSHA1ofJSON = function(input){
    return crypto.createHash('sha1').update(JSON.stringify(input)).digest('hex')
}

Ensuite:

getSHA1ofJSON('whatever')

ou

getSHA1ofJSON(['whatever'])

ou

getSHA1ofJSON({'this':'too'})
21
mikemaccana

S'il vous plaît lisez et considérez fortement mon conseil dans les commentaires de votre post. Cela étant dit, si vous avez encore une bonne raison de le faire, jetez un œil à cette liste des modules crpyto pour Node. Il a des modules pour traiter à la fois sha1 et base64.

8
Alex Turpin

Conseils pour éviter les problèmes (mauvaise hachage):

J'ai constaté que NodeJS hachait la représentation UTF-8 de la chaîne. D'autres langages (comme Python, PHP ou Perl ...) hachent la chaîne d'octets.

Nous pouvons ajouter l'argument binaire pour utiliser la chaîne d'octets.

const crypto = require("crypto");

function sha1(data) {
    return crypto.createHash("sha1").update(data, "binary").digest("hex");
}

sha1("Your text ;)");

Vous pouvez essayer avec: "\ xac", "\ xd1", "\ xb9", "\ xe2", "\ xbb", "\ x93", etc ...

Autres langues (Python, PHP, ...):

sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47

Nodejs:

sha1 = crypto.createHash("sha1").update("\xac", "binary").digest("hex") //39527c59247a39d18ad48b9947ea738396a3bc47
//without:
sha1 = crypto.createHash("sha1").update("\xac").digest("hex") //f50eb35d94f1d75480496e54f4b4a472a9148752
4
A-312