Implementacja Diffiego Hellmana - NodeJS
Diffie Hellman to algorytm wymiany kluczy, w którym klient i serwer generują klucz publiczny i prywatny, wymieniają swój klucz publiczny i łączą ten klucz z własnym kluczem prywatnym, aby wygenerować ten sam klucz tajny.
Ale tutaj jest zamieszanie w implementacji. Oto kod ...
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);
Przede wszystkim serwer tworzy instancję DiffieHellmanklasy do generowania klucza. Ale klient potrzebuje prime serwera (.getPrime ()) i generatora (.getGenerator ()), aby wygenerować kolejną instancję DiffieHellmanklasy w celu wygenerowania klucza.
Tak więc serwer musi przekazać wartość server.getPrime()i server.getGenerator()do klienta. Co się stanie, jeśli w tym czasie dojdzie do ataku pośrednika? Ponieważ, jeśli w jakiś sposób haker dostanie te dwie rzeczy, może również wygenerować ten sam tajny klucz. (-_-)
Jakieś rozwiązanie? Pomyśl o tym systemie bez TLS.
Odpowiedzi
Zakładasz, że generateKeysjest to operacja deterministyczna, więc atakujący znający parametry DH wygeneruje dokładnie te same klucze. Ale to błędne założenie. Atakujący otrzyma różne klucze, nawet jeśli użyje tych samych parametrów DH, ponieważ generowanie kluczy jest związane z losowością, a atakujący nie może odtworzyć losowości używanej przez klienta.