es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo generar un par RSA que funcione tanto en node.js como en el navegador?

Quiero lograr la encriptación RSA entre un servidor de nodo y un navegador.
Hasta ahora he utilizado node-rsa en el servidor:

const RSA = require(“node-rsa”)
const key = new RSA({b: 512});
console.log(key.exportKey(“public”))

Y se ve así:

—–BEGIN PUBLIC KEY—–
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMSZQk6XJbPTr/0bY1OYQUPkUXfsC4K8
iPywjTpIDLZhw341cxPaiI0dxkP/GLvG+03xqboFMRFJbs4L5aXA9x0CAwEAAQ==
—–END PUBLIC KEY—–

¿Cómo puedo hacer lo mismo en un navegador?
PD. He intentado el API SubtleCrypto, pero no puedo entender cómo producir un formato similar al de node-rsa.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la encriptación RSA entre un servidor node y un navegador, se pueden seguir los siguientes pasos:

    1. Crear un par de claves RSA en el servidor usando node-rsa:
      const RSA = require("node-rsa");
      const key = new RSA({b: 512});
      console.log(key.exportKey("public"));
      
    2. Enviar la clave pública al navegador, donde se puede utilizar SubtleCrypto para encriptar datos:
      // Obtener la clave pública del servidor
      const publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMSZQk6XJbPTr/0bY1OYQUPkUXfsC4K8" +
                        "iPywjTpIDLZhw341cxPaiI0dxkP/GLvG+03xqboFMRFJbs4L5aXA9x0CAwEAAQ==";
      
      // Convertir la clave pública a un objeto CryptoKey
      const publicKeyBuffer = new Uint8Array(atob(publicKey).split("").map(char => char.charCodeAt(0))).buffer;
      const publicKeyObject = await crypto.subtle.importKey("spki", publicKeyBuffer, { name: "RSA-OAEP", hash: "SHA-256" }, false, ["encrypt"]);
      
      // Encriptar datos utilizando la clave pública
      const message = "¡Hola, mundo!";
      const encrypted = await crypto.subtle.encrypt({ name: "RSA-OAEP" }, publicKeyObject, new TextEncoder().encode(message));
      console.log(new Uint8Array(encrypted).toString());
      

      Esto debería producir un mensaje encriptado en un formato de buffer. Para convertirlo a un formato de cadena similar al formato de clave pública de node-rsa, se puede utilizar btoa para convertir el buffer a una representación en base64:

      console.log(btoa(String.fromCharCode.apply(null, new Uint8Array(encrypted))));
      

      Esto debería producir una cadena que se parece al formato de clave pública de node-rsa:

      "hHj3tbYATdHN/cJQC4ez06s9sR1U6BnL98b1uJdKTWO08cFRjwLQ2V7SPmhDriX9Bs7nYZjtt+Ql0Nlcqnj1xsy/D8BdqIA/0Am+1KKN/9tZ5CGtLV0KjOjrPm+0C0/qyOYWWIUakuvjKx+iedOtHJvZq3hWsdodBRTUR/mOI1Y="
      

Comments are closed.