Implementación de Diffie Hellman - NodeJS

Aug 19 2020

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 DiffieHellmanclase para generar la clave. Pero, el cliente necesita el servidor principal (.getPrime ()) y el generador (.getGenerator ()) para generar otra instancia de DiffieHellmanclase 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

2 SteffenUllrich Aug 19 2020 at 00:04

Está asumiendo que generateKeyses 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.