¿Qué pasa con el descifrado crypto de nodejs?

Tengo los siguientes datos encriptados:

U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o

El pase para descifrarlo es: password

(es el ejemplo de galimatías )

En la línea de comando usando openssl:

echo "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o" | openssl enc -d -aes-256-cbc -a -k password

El resultado es:

Made with Gibberish\n

Con mi aplicación NodeJS:

  var decipher = crypto.createDecipher('aes-256-cbc', "password"); var dec = decipher.update("U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o", 'base64', 'utf8'); dec += decipher.final('utf8'); 

Tengo el siguiente error TypeError: DecipherFinal fail en la línea de decipher.final .

Me estoy perdiendo de algo ? Gracias.

Los datos encriptados comienzan con una “magia” de 8 bytes que indica que hay una sal (la encoding ASCII de "Salted__" ). Entonces los próximos 8 bytes son la sal. Ahora las malas noticias: Node.js no parece usar la sal para el método EVP_BytesToKey:

 int key_len = EVP_BytesToKey(cipher, EVP_md5(), NULL, (unsigned char*) key_buf, key_buf_len, 1, key, iv); 

Ese NULL es la sal.

Esto se ha verificado utilizando una aplicación de prueba de Java (utilizando la sal correcta): se devolvió la cadena resultante.

Por favor, -nosalt la sal con el interruptor OpenSSL -nosalt y vuelva a intentarlo.

[EJEMPLO]

OpenSSL CLI:

 openssl enc -aes-256-cbc -nosalt -a -k password owlstead Mh5yxIyZH+fSMTkSgkLa5w== 

NodeJS crypto:

 var crypto=require('crypto') var cipher=crypto.createDecipher('aes-256-cbc', "password") var enc = cipher.update("Mh5yxIyZH+fSMTkSgkLa5w==", 'base64', 'utf8') enc += cipher.final('utf8') 

[EDITAR TARDE] Tenga en cuenta que el uso de la derivación de clave secreta con un factor de sal y de trabajo grande puede ser primordial para la seguridad. Será mejor que use una contraseña de entropía única y muy alta, de lo contrario, sus datos encriptados podrían estar en riesgo.


[EDITAR REALMENTE A LA MEDIDA ] OpenSSL 1.1.0c cambió el algoritmo de resumen utilizado en algunos componentes internos. Anteriormente, se usaba MD5 y 1.1.0 cambiaba a SHA256. Tenga cuidado de que el cambio no le afecte tanto en EVP_BytesToKey como en comandos como openssl enc .