我正在尝试编写一个函数,它将使用本机openssl为我做一些RSA繁重的工作,而不是使用js RSA库。目标是
Node中的child process module有一个exec命令,但是我无法看到如何将输入传递给进程并将其传回给我的进程。基本上我想执行以下类型的命令,但不必依赖于将文件写入文件(没有检查openssl的确切语法)
cat the_binary_file.data | openssl -encrypt -inkey key_file.pem -certin > the_output_stream
我可以通过编写临时文件来完成此操作,但如果可能的话,我想避免使用它。产生子进程允许我访问stdin / out但是没有为exec找到这个功能。
我这样做的方式是否有一种干净的方法可以做到这一点?是否有一些使用openssl的替代方法,例如openssl lib的一些本机绑定,这样我就可以在不依赖命令行的情况下完成这个操作了吗?
答案 0 :(得分:4)
您已经提到spawn
,但似乎认为您无法使用它。可能在这里显示我的无知,但看起来它应该只是你正在寻找的东西:通过spawn
启动openssl,然后写入child.stdin
并从child.stdout
读取。非常类似于完全未经测试的代码:
var util = require('util'),
spawn = require('child_process').spawn;
function sslencrypt(buffer_to_encrypt, callback) {
var ssl = spawn('openssl', ['-encrypt', '-inkey', ',key_file.pem', '-certin']),
result = new Buffer(SOME_APPROPRIATE_SIZE),
resultSize = 0;
ssl.stdout.on('data', function (data) {
// Save up the result (or perhaps just call the callback repeatedly
// with it as it comes, whatever)
if (data.length + resultSize > result.length) {
// Too much data, our SOME_APPROPRIATE_SIZE above wasn't big enough
}
else {
// Append to our buffer
resultSize += data.length;
data.copy(result);
}
});
ssl.stderr.on('data', function (data) {
// Handle error output
});
ssl.on('exit', function (code) {
// Done, trigger your callback (perhaps check `code` here)
callback(result, resultSize);
});
// Write the buffer
ssl.stdin.write(buffer_to_encrypt);
}
答案 1 :(得分:1)
当您调用exec时,您应该能够将编码设置为二进制,例如..
exec("openssl output_something_in_binary", {encoding: 'binary'}, function(err, out, err) {
//do something with out - which is in the binary format
});
如果你想写出" out"的内容在二进制文件中,请确保再次将编码设置为二进制,例如..
fs.writeFile("out.bin", out, {encoding: 'binary'});
我希望这有帮助!