node.js - 32bit - ¿Qué pasa con el descifrado crypto de nodejs?
node versions (1)
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. 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
.