DiffieHellmanの実装-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()
クライアントに渡す必要があります。今回、中間者攻撃が発生した場合はどうなりますか?なぜなら、ハッカーがこの2つのことを取得した場合、同じ秘密鍵を生成することもできるからです。(-_-)
解決策はありますか?TLSなしのこのシステムを考えてください。
回答
2 SteffenUllrich Aug 19 2020 at 00:04
generateKeys
DHパラメータを知っている攻撃者がまったく同じキーを生成するように、これは決定論的な操作であると想定しています。しかし、これは間違った仮定です。キーの生成時にランダム性が関係し、攻撃者はクライアントが使用するランダム性を複製できないため、攻撃者は同じDHパラメーターを使用している場合でも異なるキーを使用することになります。