Реализация Диффи Хеллмана - NodeJS
Diffie Hellman - это алгоритм обмена ключами, в котором клиент и сервер генерируют открытый и закрытый ключ, обмениваются своим открытым ключом и объединяют этот ключ со своим собственным закрытым ключом для генерации одного и того же секретного ключа.
Но вот путаница в реализации. Вот код ...
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);
Прежде всего, сервер создает экземпляр DiffieHellman
класса для генерации ключа. Но клиенту нужны первичный сервер (.getPrime ()) и генератор (.getGenerator ()) для генерации другого экземпляра DiffieHellman
класса для генерации ключа.
Итак, серверу необходимо передать значение server.getPrime()
и server.getGenerator()
клиенту. Что произойдет, если в это время разовьется атака посредников? Потому что, если каким-то образом хакеры получат эти две вещи, они также могут сгенерировать тот же секретный ключ. (-_-)
Любое решение? Подумайте об этой системе без TLS.
Ответы
Вы предполагаете, что generateKeys
это детерминированная операция, так что злоумышленник, зная параметры DH, сгенерирует точно такие же ключи. Но это ошибочное предположение. Злоумышленник получит разные ключи даже при использовании одних и тех же параметров DH, поскольку при генерации ключей участвует случайность, и злоумышленник не может воспроизвести случайность, используемую клиентом.