我使用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或一个数组作为保存公钥和私钥的结果。
所以欢迎任何建议,谢谢你。
答案 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)
它真的易于使用并且异步:
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但是:
PS:keypair使用原生JS,这就是为什么它很慢。 Node.js不推荐不擅长执行CPU密集型操作(但非阻塞事件很好)。