¿Cómo convertir el cifrado del módulo criptográfico incorporado del siguiente nodo a CryptoJS ?
const crypto = require('crypto'); const pass = 'some,password:)with>spec(chars*' const cipher1 = crypto.createCipher('aes-256-cbc', pass) const c1 = cipher1.update(input, 'utf8', 'hex') + cipher1.final('hex')Intenté algo como esto, pero los resultados no son los mismos:
const CryptoJS = require('crypto-js'); const pass = 'some,password:)with>spec(chars*' const cipher2 = CryptoJS.AES.encrypt(input, pass, { mode: CryptoJS.mode.CBC, }); const c2 = cipher2.ciphertext.toString(CryptoJS.enc.Hex); Necesito esto para usarlo como un script de solicitud previa de Postman, ya que no admite crypto de Node, sino crypto-js .
Ambos códigos usan la función de derivación de clave patentada de OpenSSL EVP_BytesToKey() con un recuento de iteraciones de 1 y MD5 como resumen.
NodeJS no usa una sal, mientras que CryptoJS aplica una sal aleatoria . Por esta razón, el resultado de NodeJS no cambia para cada encriptación, mientras que el resultado de CryptoJS siempre cambia (asumiendo el mismo texto sin formato y frase de contraseña).
Por lo tanto, para obtener el resultado del código NodeJS con el código CryptoJS, no debe usar una sal. Sin embargo, por defecto, siempre se aplica una sal. Esto solo se puede eludir determinando explícitamente la clave y el IV con la función de derivación de clave EvpKDF y luego usando ambos en el cifrado:
var input = "The quick brown fox jumps over the lazy dog"; var pass = 'some,password:)with>spec(chars*' var keySize = 32/4; var ivSize = 16/4; var kdf = CryptoJS.algo.EvpKDF.create({ keySize: keySize + ivSize, hasher: CryptoJS.algo.MD5 }).compute(pass, ''); // no salt! var key = CryptoJS.lib.WordArray.create(kdf.words.slice(0, keySize), keySize * 4); var iv = CryptoJS.lib.WordArray.create(kdf.words.slice(keySize), ivSize * 4); var ciphertextCP = CryptoJS.AES.encrypt(input, key, {iv: iv}); // default: CBC, PKCS#7 padding var ciphertext = ciphertextCP.ciphertext.toString(CryptoJS.enc.Hex); document.getElementById("ct").innerHTML = ciphertext; // d98cf2d285bf0c1d796226190bf54d9c5540300ee1c6f35618f8bb3564b5053920ec958d31b41bbe4e4880e23543d709 <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script> <p style="font-family:'Courier New', monospace;" id="ct"></p>Este código CryptoJS produce el mismo texto cifrado para el mismo texto sin formato y frase de contraseña que el código NodeJS.
Tenga en cuenta que la derivación de clave con EVP_BytesToKey() y los parámetros elegidos están obsoletos y se consideran inseguros hoy. Esto es cierto para NodeJS en mayor medida que para CryptoJS, debido a la falta de sal.
Es más seguro evitar la función de derivación de clave incorporada y especificar la clave directamente.
Para hacer esto, use createCipheriv() en NodeJS y pase la clave como WordArray en el código CryptoJS. De esta forma, se debe generar explícitamente un IV aleatorio para cada encriptación.
Opcionalmente, se puede usar una función de derivación de clave confiable como PBKDF2, que es compatible con ambas bibliotecas.