Node.js用于使用Open SSL生成RSA密钥

时间:2013-09-25 11:10:41

标签: node.js openssl rsa

我使用Node.js作为服务器端语言,我想为在我的网站上注册自己的任何用户生成一个RSA密钥对。我正在使用名为keypair的模块。它适用于小尺寸的键,但是当我生成大小为2048的键时,执行它需要很长时间,因此我想使用Node的child_process直接从Node.js使用Open SSL,如下面的脚本中所述: / p>

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或一个数组作为保存公钥和私钥的结果。

所以欢迎任何建议,谢谢你。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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的包装。没有直接的安全性差异(请参阅this for more information)。

PS:看看唯一的48 lines of code作曲rsa-json。


如果真的想要使用OpenSSL,您可以查看ursa module但是:

  • 非异步
  • 未维护,last commit来自2012年12月21日
  • 项目很重,它做的事情太多了,比如含糖的东西(base64编码等)。
  • 它内部嵌入了C ++ OpenSSL包装,在安装过程中进行了初始化。

PS:keypair使用原生JS,这就是为什么它很慢。 Node.js不推荐不擅长执行CPU密集型操作(但非阻塞事件很好)。