2010-12-21 28 views
8

Tengo problemas extraños con la biblioteca de cifrado de Node. Escribí este sencillo script de prueba AES:Node.js y crypto library

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') 

Cuando hago console.log (dec), es nulo. Por alguna razón, si configuro la prueba "123 | 123123", funciona. Entonces, ¿por qué funciona "123 | 123123" pero "123 | 123123123123123" no?

+1

La última longitud de trabajo para el texto parece ser de 15 caracteres. – Mike

Respuesta

27

Necesita almacenar el retorno de cifrado.actualizar y cifrar.final para asegurarse de tener todo.

cipher.update "devuelve el contenido cifrados, y se puede llamar muchas veces con nuevos datos a medida que se transmite":

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

cipher.final "devuelve los restantes contenidos cifrados".

creo que acaba de anexar los resultados con cada llamada como esto:

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'); 

recibo el mensaje '12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585' para encriptado y '123 | 123123123123123' para diciembre en lo anterior con v0.2.5 nodo

+3

RandomEtc es correcto, recuerde que en node.js, todo está optimizado para, bueno, las transmisiones. Las funciones de cifrado y cifrado pueden actualizarse con texto en cualquier cantidad de veces, lo que simplemente le agrega texto, pero para obtener el resultado, debe hacer un hash.digest o cifrado.final – Vanwaril

+0

RandomEtc, gracias por su respuesta a esto. ¡Me llevó allí en criptografía finalmente! :) –

8

RandomEtc es correcto, pero en caso de que alguien tropiece con esta pregunta usa 'base64' como su codificación: No. Se adhieren a 'hex'. Al menos desde 0.4.2, hay un error que puede dar como resultado datos dañados cuando se usa 'base64'. Ver: https://github.com/joyent/node/issues/738/