Triển khai Diffie Hellman- NodeJS
Diffie Hellman là một thuật toán trao đổi khóa trong đó máy khách và máy chủ đều tạo khóa công khai và khóa riêng, trao đổi khóa công khai của chúng và kết hợp khóa này với khóa riêng của anh ta để tạo ra cùng một khóa bí mật.
Nhưng, đây là một sự nhầm lẫn trong việc thực hiện. Đây là mã ...
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);
Trước hết, máy chủ tạo một thể hiện của DiffieHellmanlớp để tạo khóa. Tuy nhiên, máy khách cần phần tử chính của máy chủ (.getPrime ()) và Trình tạo (.getGenerator ()) để tạo một thể hiện khác của DiffieHellmanlớp để tạo khóa.
Vì vậy, máy chủ cần chuyển giá trị của server.getPrime()và server.getGenerator()cho máy khách. Điều gì sẽ xảy ra nếu bất kỳ cuộc tấn công trung gian nào xuất hiện trong thời điểm này? Bởi vì, nếu bằng cách nào đó hacker có được hai thứ này thì họ cũng có thể tạo ra cùng một khóa bí mật. (-_-)
Bất kì giải pháp nào? Hãy nghĩ rằng hệ thống này không có TLS.
Trả lời
Bạn đang giả định rằng đó generateKeyslà một hoạt động xác định để kẻ tấn công biết các tham số DH sẽ tạo ra chính xác các khóa giống nhau. Nhưng đây là một giả định sai lầm. Kẻ tấn công sẽ kết thúc với các khóa khác nhau ngay cả khi sử dụng cùng một thông số DH vì tính ngẫu nhiên có liên quan khi tạo các khóa và kẻ tấn công không thể sao chép tính ngẫu nhiên được sử dụng bởi máy khách.