Implementação de Diffie Hellman - NodeJS
Diffie Hellman é um algoritmo de troca de chaves onde o cliente e o servidor geram chaves públicas e privadas, trocam suas chaves públicas e combinam esta chave com sua própria chave privada para gerar a mesma chave secreta.
Mas, aqui está uma confusão na implementação. Aqui está o 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);
Em primeiro lugar, o servidor cria uma instância de DiffieHellmanclasse para gerar a chave. Mas, o cliente precisa do principal do servidor (.getPrime ()) e do Generator (.getGenerator ()) para gerar outra instância de DiffieHellmanclasse para gerar a chave.
Portanto, o servidor precisa passar o valor de server.getPrime()e server.getGenerator()para o cliente. O que acontecerá se qualquer ataque de intermediário aumentar neste período? Porque, se de alguma forma o hacker conseguir essas duas coisas, eles também podem gerar a mesma chave secreta. (-_-)
Qualquer solução? Pense neste sistema sem TLS.
Respostas
Você está assumindo que generateKeysé uma operação determinística, de modo que um invasor que conhece os parâmetros DH irá gerar exatamente as mesmas chaves. Mas esta é uma suposição errada. O invasor terminará com chaves diferentes mesmo ao usar os mesmos parâmetros DH, pois a aleatoriedade está envolvida na geração das chaves e o invasor não pode replicar a aleatoriedade usada pelo cliente.