1

サーバー側の言語として Node.js を使用しています。自分の Web サイトに登録するすべてのユーザーの RSA キー ペアを生成したいと考えています。keypairというモジュールを使用しています。小さなサイズのキーでは問題なく機能しますが、サイズが 2048 のキーを生成すると実行に時間がかかるため、以下のスクリプトで説明されているように、Node の child_process を使用して Node.js から直接 Open SSL を使用したいと考えています。

var cp = require('child_process')
  , assert = require('assert');

var privateKey, publicKey;
publicKey = '';
cp.exec('openssl genrsa 2048', function(err, stdout, stderr) {
  assert.ok(!err);
  privateKey = stdout;
  console.log(privateKey);
  makepub = cp.spawn('openssl', ['rsa', '-pubout']);
  makepub.on('exit', function(code) {
    assert.equal(code, 0); 
    console.log(publicKey);
  });
  makepub.stdout.on('data', function(data) {
    publicKey += data;
  });
  makepub.stdout.setEncoding('ascii');
  makepub.stdin.write(privateKey);
  makepub.stdin.end();  
});

これは機能しており、Node.js キーペア モジュールよりもキー ペアの生成が高速であるため、私が抱えている問題は、このコードを理解できないことです (サーバー側でファイルを書き込んで、それらからキーを読み取るかどうか)。 ) このスクリプトを、公開鍵と秘密鍵を保持する結果として JSON または配列を返す関数に変えたいと思います。

どんな提案でも大歓迎です、事前に感謝します。

4

2 に答える 2

2

これを試してください..コードを少し移動しました。削除された tmp ファイルを使用します。おそらく tmp ファイルなしで実行できますが、これは機能するはずです。

var cp = require('child_process')
  , assert = require('assert')
  , fs = require('fs')
  ;

// gen pub priv key pair
function genKeys(cb){
    // gen private
    cp.exec('openssl genrsa 2048', function(err, priv, stderr) {
      // tmp file
      var randomfn = './' + Math.random().toString(36).substring(7);
      fs.writeFileSync(randomfn, priv);
      // gen public
      cp.exec('openssl rsa -in '+randomfn+' -pubout', function(err, pub, stderr) {
           // delete tmp file
           fs.unlinkSync(randomfn);
           // callback
           cb(JSON.stringify({public: pub, private: priv}, null, 4));
      });

    });
}

genKeys(console.log);
于 2013-09-25T14:32:17.363 に答える
0

小さなrsa-jsonモジュールを簡単に使用できます

とても使いやすく、非同期です:

var createRsaKeys = require('rsa-json');

createRsaKeys({bits: 1024}, function(err, keyPair) {
    console.log(keyPair.private);
    console.log(keyPair.public);
});

rsa-jsonは、 OpenSSL RSA_generate_keyを直接使用するのではなく、 OpenSSL のラッパーであるssh-keygen ( OpenSSHから) を使用します。セキュリティに直接的な違いはありません (詳細については、こちらを参照してください)。

PS: rsa-json を構成するわずか48 行のコードを見てください。


本当にOpenSSL を使用したい場合は、 ursa モジュールを参照してください。

  • 非同期ではない
  • 維持されていません。最後のコミットは 2012 年 12 月 21 日からです。
  • プロジェクトは重く、甘いもの (base64 エンコーディングなど) が多すぎます。
  • 内部に C++ OpenSSL ラッパーが埋め込まれており、インストール中に初期化されます。

PS: keypairはネイティブ JS を使用するため、非常に低速です。CPU を集中的に使用する操作の実行が苦手な Node.js ではお勧めしません (ただし、非ブロッキング イベントには適しています)。

于 2014-06-02T09:56:21.590 に答える