Реализация Диффи Хеллмана - NodeJS

Aug 19 2020

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.

Ответы

2 SteffenUllrich Aug 19 2020 at 00:04

Вы предполагаете, что generateKeysэто детерминированная операция, так что злоумышленник, зная параметры DH, сгенерирует точно такие же ключи. Но это ошибочное предположение. Злоумышленник получит разные ключи даже при использовании одних и тех же параметров DH, поскольку при генерации ключей участвует случайность, и злоумышленник не может воспроизвести случайность, используемую клиентом.