He estado luchando con esto durante un par de días y me preguntaba si alguien tendría la experiencia para conocer estas dos bibliotecas de cifrado lo suficientemente bien como para ayudar.
Actualmente estoy creando una carga útil de SSO de acuerdo con las instrucciones que me dio un proveedor. Los pasos para crear esto se destacan de la siguiente manera:
Cree un cifrado AES 256 CBC de la carga útil
i. La clave será un resumen SHA256 del token del sitio.
2. Base64 codifica el vector de inicialización (IV) y la carga útil cifrada desde arriba
3. Escape CGI de la salida del paso 2.
4. Su carga útil final sería algo así como
ikUbqiutwMhi%2Bjg6WwUHyeZB76g6LdLGcrKrEV4YpvQ%3D%0A.
SHA256 siempre generará un hash de 32 bytes, pero no se puede mostrar bien en Base64. Cuando se muestra como hexadecimal, son 32 pares de valores hexadecimales (un total de 64 caracteres en la pantalla) pero representan solo 32 bytes.
Pude hacerlo funcionar en Ruby con Open SSL, el código es:
require 'digest' require 'openssl' require "base64" require 'cgi' require 'json' cipher = OpenSSL::Cipher.new('aes-256-cbc') cipher.encrypt cipher.key = Digest::SHA256.digest(siteToken) iv = cipher.random_iv data= unencryptedPayload encrypted = cipher.update(JSON.generate(data)) + cipher.final encoded = CGI::escape(Base64.encode64(iv + encrypted)) puts encoded
Sin embargo, todavía no he tenido suerte con la biblioteca Crypto de Node.js. Esto es lo que tengo hasta ahora:
const crypto = require('crypto'); // Defining algorithm const algorithm = 'aes-256-cbc'; // Defining key //'key' variable is defined and equal to siteToken in the OpenSSL version //const key = siteToken; // Defining iv const iv = crypto.randomBytes(16); // An encrypt function function encrypt(text) { // Creating Cipheriv with its parameter let cipher = crypto.createCipheriv( 'aes-256-cbc', Buffer.from(key), iv); // Updating text let encrypted = cipher.update(text); // Using concatenation encrypted = Buffer.concat([encrypted, cipher.final()]); // Returning iv and encrypted data return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') }; } // Displays output var output = encrypt(unencryptedPayload);
Creo que mi código hasta ahora ha cubierto casi todos estos, excepto el resumen SHA256 del token del sitio. ¿Alguien sabe cómo podría lograr esto en términos de Node.js?
¡Gracias!