1

我使用 Node.js 作为服务器端语言,我想为在我的网站上注册的任何用户生成一个 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,而是使用ssh-keygen(来自OpenSSH),它是 OpenSSL 的包装器。没有直接的安全差异(有关更多信息,请参阅此内容)。

PS:看看构成 rsa-json的仅有48 行代码。


如果你真的想使用 OpenSSL,你可以看看ursa 模块,但是:

  • 不是异步的
  • 未维护,最后一次提交是从 2012 年 12 月 21 日
  • 这个项目很重,它做了太多的事情,比如含糖的东西(base64 编码等)。
  • 它在其中嵌入了 C++ OpenSSL 包装器,并在安装期间进行了初始化。

PS:keypair使用原生 JS,所以速度很慢。不推荐使用不擅长执行 CPU 密集型操作(但擅长非阻塞事件)的 Node.js。

于 2014-06-02T09:56:21.590 回答