online crypto javascript node.js cryptography aes cryptojs

javascript - online - cryptojs angular 4



Problemas al usar AES crypto entre Node y CryptoJS en el navegador (1)

CryptoJS admite el mismo modo de encriptación basado en contraseñas que admite el módulo de cifrado en node.js, que se implementa como el equivalente a EVP_BytesToKey. CryptoJS genera una sal aleatoria por defecto, pero node.js no y usa una sal vacía. Una sal vacía es mala y no debe usarse. Además, no es seguro derivar una clave de una contraseña con este método. Uno necesita usar PBKDF2 (soportado por CryptoJS y node.js) o similar con muchas iteraciones y sal aleatoria.

var ctHex = ''83684beb6c8cf063caf45cb7fad04a50''; var ct = CryptoJS.enc.Hex.parse(ctHex); var salt = CryptoJS.lib.WordArray.create(0); // empty array var decrypted = CryptoJS.AES.decrypt({ciphertext: ct, salt: salt}, ''key''); document.querySelector("#dec").innerHTML = decrypted.toString(CryptoJS.enc.Utf8);

<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script> Expected: "1"<br/>Got: "<span id="dec"></span>"

Dijiste que esto se haría a través de HTTP.

Si desea utilizar la seguridad del transporte sin la intervención del usuario, entonces esto es completamente inseguro, ya que la clave debe transmitirse junto con el texto cifrado, lo que hace que, en el mejor de los casos, se ofusque .

Si tanto el usuario como el servidor conocen la contraseña antes de la comunicación, esto sigue siendo insuficiente, ya que la derivación de la clave que proporcionan tanto CryptoJS como node.js es insuficiente y se debe utilizar algo como PBKDF2. MD5 es fácilmente resistente a la fuerza bruta.

Debería utilizar una criptografía asimétrica para proteger esta comunicación contra un atacante pasivo (uno que no puede inyectar paquetes arbitrarios en la secuencia entre el servidor y el cliente). Sugiero que genere un par de claves RSA y envíe la clave pública al cliente para que el cliente pueda encriptar un mensaje al servidor. Puedes usar forge para eso.

La encriptación se vería así:

var salt = CryptoJS.lib.WordArray.create(0); // empty array var params = CryptoJS.kdf.OpenSSL.execute(''key'', 256/32, 128/32, salt); var pt = ''1''; var encrypted = CryptoJS.AES.encrypt(pt, params.key, {iv: params.iv}); document.querySelector("#enc").innerHTML = encrypted.ciphertext.toString();

<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script> Expected: "83684beb6c8cf063caf45cb7fad04a50"<br/>Got: "<span id="enc"></span>"

Quiero cifrar una cadena con Node y descifrar la cadena con CryptoJS en el navegador.

Encriptar:

var crypto = require(''crypto''); function encrypt(txt, cryptkey) { var cipher = crypto.createCipher(''aes-256-cbc'', cryptkey); var crypted = cipher.update(txt, ''utf8'', ''hex''); crypted += cipher.final(''hex''); return crypted; } encrypt(''1'', ''key''); // 83684beb6c8cf063caf45cb7fad04a50

Incluir:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>

Descifrar

var decrypted = CryptoJS.AES.decrypt(''83684beb6c8cf063caf45cb7fad04a50'', ''key''); console.log(decrypted.toString(CryptoJS.enc.Utf8)); // empty string

El resultado real es cadena vacía.

¿Cuál es la forma correcta de descifrar datos del nodo?