JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

Node.jsのcrypto.getDiffieHellman()メソッドとは?構文・使い方・サンプルコードを解説

crypto.getDiffieHellman()メソッドは、Node.jsのcryptoモジュールに用意されている関数の一つで、事前に定義されたDiffie-Hellmanグループをもとに鍵交換オブジェクトを生成します。利用できる主なグループとしては、modp1、modp2、modp5、modp14、modp16、modp17などがあります。

なお、このメソッドはcrypto.createDiffieHellmanGroup()の別名(エイリアス)であり、両者はまったく同じ動作をします。

このメソッドを利用する最大のメリットは、通信当事者がグループの法数(モジュラス)を自ら生成したり交換したりする必要がない点です。その分、処理にかかる時間を節約できます。

構文

crypto.getDiffieHellman(groupName)

パラメータ

  • groupName - 使用するDiffie-Hellmanグループの名前を指定します。型は「string」です。modp1、modp2、modp5、modp14、modp16、modp17などの値が指定できます。

戻り値

指定されたグループ名に対応するDiffieHellmanGroupオブジェクトを返します。存在しないグループ名を渡した場合はERR_CRYPTO_UNKNOWN_DH_GROUPエラーがスローされるため、注意が必要です。

サンプルコード1:同一グループでの鍵交換

まず「getDiffieHellman.js」という名前のファイルを作成し、以下のコードを記述します。保存後、次のコマンドで実行できます。

node getDiffieHellman.js

getDiffieHellman.js

// crypto.getDiffieHellman() のデモ例

// cryptoモジュールを読み込む
const crypto = require('crypto');

// サーバーとクライアントで同じグループ(modp1)を指定
const server = crypto.getDiffieHellman('modp1');
const client = crypto.getDiffieHellman('modp1');

// DiffieHellmanオブジェクトの中身を出力
console.log(server);
console.log(client);

// 公開鍵・秘密鍵のペアを生成
server.generateKeys();
client.generateKeys();

// 相手の公開鍵から共有秘密鍵を計算
const serverSecret = server.computeSecret(client.getPublicKey(), null, 'hex');
const clientSecret = client.computeSecret(server.getPublicKey(), null, 'hex');

/* 2つの共有秘密鍵は一致するはず */
console.log(serverSecret === clientSecret);

実行結果

C:\home\node>> node getDiffieHellman.js
DiffieHellmanGroup { _handle: { verifyError: [Getter] }, verifyError: 0 }
DiffieHellmanGroup { _handle: { verifyError: [Getter] }, verifyError: 0 }
true

出力の最後にtrueが表示されています。これは、サーバー側とクライアント側がそれぞれ相手の公開鍵を使って計算した共有秘密鍵が完全に一致したことを意味します。これこそがDiffie-Hellman鍵交換の基本的な仕組みであり、両者は安全に共通鍵を共有できたことになります。

サンプルコード2:異なるグループを混在させた場合

続いて、別の例として、異なるグループを組み合わせた場合にどうなるかを確認してみましょう。

// crypto.getDiffieHellman() のデモ例

// cryptoモジュールを読み込む
const crypto = require('crypto');

// 異なるグループ(modp17とmodp14)を指定
const dh1 = crypto.getDiffieHellman('modp17');
const dh2 = crypto.getDiffieHellman('modp14');

// 公開鍵・秘密鍵のペアを生成
dh1.generateKeys();
dh2.generateKeys();

// 相手の公開鍵から共有秘密鍵を計算
const dh1Key = dh1.computeSecret(dh2.getPublicKey(), null, 'hex');
const dh2Key = dh2.computeSecret(dh1.getPublicKey(), null, 'hex');

/* 2つの共有秘密鍵は一致するはず */
console.log(dh1Key === dh2Key);

実行結果

C:\home\node>> node getDiffieHellman.js
internal/crypto/diffiehellman.js:102
const ret = this._handle.computeSecret(toBuf(key, inEnc));
                    ^
Error: Supplied key is too large
    at DiffieHellmanGroup.dhComputeSecret [as computeSecret]
        (internal/crypto/diffiehellman.js:102:28)
    at Object.<anonymous> (/home/node/test/getDiffieHellman.js:15:20)
    ...

今度はError: Supplied key is too large(指定されたキーが大きすぎます)というエラーが発生しました。これは、modp17とmodp14では素数のビット長が異なり、片方のグループで生成された公開鍵がもう片方のグループでは扱えないためです。

この結果からもわかるように、Diffie-Hellman鍵交換を行う際には、通信当事者が必ず同じグループを使用しなければなりません。getDiffieHellman()を使えば定義済みグループを簡単に共有できるため、こうした不整合を防ぎながら、実装の手間と処理時間を削減できます。


  1. Node.jsのcrypto.privateDecrypt()メソッドの使い方を徹底解説

    crypto.privateDecrypt()メソッドは、crypto.publicEncrypt()メソッドを使って対応する公開鍵で事前に暗号化されたデータを、パラメータとして渡された秘密鍵を用いて復号するために使用されます。RSA暗号方式などの公開鍵暗号システムにおいて、安全なデータ復号を実現するための重要なAPIです。 構文 crypto.privateDecrypt(privateKey, buffer) パラメータ このメソッドが受け取る各パラメータの詳細は以下のとおりです。 privateKey(秘密鍵) – 復号に使用する秘密鍵を指定します。Object、String、Bu

  2. Node.jsのcrypto.getHashes()メソッドとは?使い方とサポートされるハッシュアルゴリズム一覧の取得方法

    crypto.getHashes()メソッドは、Node.jsでサポートされているすべてのハッシュアルゴリズムの名前を配列形式で返します。cryptoモジュールには非常に多くのハッシュアルゴリズムが用意されており、その中でも歴史的によく使われてきたのが「MD5(Message-Digest Algorithm 5)」です。ただし、MD5には衝突耐性の脆弱性があるため、現在ではセキュリティ用途にはSHA-256やSHA3系など、より強力なアルゴリズムを使うことが推奨されています。 構文 crypto.getHashes() 引数(パラメータ) このメソッドは、サポートされているハッシュアルゴ