2010-12-21 4 views
8

Je rencontre des problèmes étranges avec la bibliothèque Crypto de nœud. J'ai écrit ce script de test AES simple:Node.js et bibliothèque Crypto

var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8') 
var text = "123|123123123123123"; 
cipher.update(text,'utf8','hex') 
var crypted = cipher.final('hex') 
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8') 
decipher.update(crypted,'hex','utf8') 
var dec = decipher.final('utf8') 

Lorsque je fais console.log (dec), il est nul. Pour une raison quelconque, si je mets le test à "123 | 123123", cela fonctionne. Alors pourquoi "123 | 123123" fonctionne-t-il mais "123 | 123123123123123" ne fonctionne pas?

+1

La dernière longueur de travail pour le texte semble être de 15 caractères. – Mike

Répondre

27

Vous devez stocker le retour de cipher.update ainsi que cipher.final pour être sûr d'avoir tout.

cipher.update « retourne le contenu cryptes, et peut être appelé plusieurs fois avec de nouvelles données comme il est transmis en continu »:

http://nodejs.org/docs/v0.2.5/api.html#cipher-update-247

cipher.final « renvoie tout contenu restant » cryptes.

Je pense que vous ajoutez simplement les résultats avec chaque appel comme celui-ci:

var crypto = require('crypto'); 
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8'); 
var text = "123|123123123123123"; 
var crypted = cipher.update(text,'utf8','hex'); 
crypted += cipher.final('hex'); 
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8'); 
var dec = decipher.update(crypted,'hex','utf8'); 
dec += decipher.final('utf8'); 

je reçois « 12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585 » pour crypted et « 123 | 123123123123123 » pour décembre dans le ci-dessus avec le noeud v0.2.5

+3

RandomEtc est correct, rappelez-vous que dans node.js, tout est rationalisé pour, bien, les flux. Les fonctions de hachage et de chiffrement peuvent être mises à jour avec du texte autant de fois que vous le souhaitez, mais pour obtenir le résultat, vous devez utiliser hash.digest ou cipher.final – Vanwaril

+0

RandomEtc, merci de votre réponse. Il m'a finalement amené sur des trucs crypto! :) –

8

RandomEtc est correct, mais juste au cas où quelqu'un trébucherait sur cette question utilise 'base64' comme leur encodage: Do not. S'en tenir à 'hex'. Au moins à partir de la version 0.4.2, un bogue peut entraîner des données corrompues lorsque 'base64' est utilisé. Voir: https://github.com/joyent/node/issues/738/

Questions connexes