Implementación de Diffie Hellman - NodeJS
Diffie Hellman es un algoritmo de intercambio de claves donde el cliente y el servidor generan claves públicas y privadas, intercambian su clave pública y combinan esta clave con su propia clave privada para generar la misma clave secreta.
Pero aquí hay una confusión en la implementación. Aquí está el código ...
const crypto = require('crypto');
const express = require('express');
const app = express();
// Generate server's keys...
const server = crypto.createDiffieHellman(139);
const serverKey = server.generateKeys();
// Generate client's keys...
const client = crypto.createDiffieHellman(server.getPrime(), server.getGenerator());
const clientKey = client.generateKeys();
// Exchange and generate the secret...
const serverSecret = server.computeSecret(clientKey);
const clientSecret = client.computeSecret(serverKey);
En primer lugar, el servidor crea una instancia de DiffieHellman
clase para generar la clave. Pero, el cliente necesita el servidor principal (.getPrime ()) y el generador (.getGenerator ()) para generar otra instancia de DiffieHellman
clase para generar la clave.
Por lo tanto, el servidor debe pasar el valor de server.getPrime()
y server.getGenerator()
al cliente. ¿Qué pasa si surge algún ataque de intermediarios en este tiempo? Porque, si de alguna manera los piratas informáticos obtienen estas dos cosas, también pueden generar la misma clave secreta. (-_-)
¿Alguna solución? Piense en este sistema sin TLS.
Respuestas
Está asumiendo que generateKeys
es una operación determinista, por lo que un atacante que conozca los parámetros DH generará exactamente las mismas claves. Pero esta es una suposición errónea. El atacante terminará con diferentes claves incluso cuando use los mismos parámetros DH, ya que la aleatoriedad está involucrada al generar las claves y el atacante no puede replicar la aleatoriedad utilizada por el cliente.