带有二进制文件的 NodeJS exec 进程

Kai*_*nen 1 javascript rsa exec node.js

我正在尝试编写一个函数,它将使用本机 openssl 为我做一些 RSA 繁重的工作,而不是使用 js RSA 库。目标是

  1. 从文件中读取二进制数据
  2. 在node进程中做一些处理,使用JS,得到一个包含二进制数据的Buffer
  3. 将缓冲区写入 exec 命令的 stdin 流
  4. RSA 加密/解密数据并将其写入标准输出流
  5. 将输入数据取回 JS-process 中的 Buffer 进行进一步处理

Node 中的子进程模块有一个 exec 命令,但我看不到如何将输入通过管道传输到进程并将其通过管道返回到我的进程。基本上我想执行以下类型的命令,但不必依赖于将内容写入文件(没有检查 openssl 的确切语法)

cat the_binary_file.data | openssl -encrypt -inkey key_file.pem -certin > the_output_stream
Run Code Online (Sandbox Code Playgroud)

我可以通过编写一个临时文件来做到这一点,但如果可能的话,我想避免它。生成子进程允许我访问 stdin/out 但还没有为 exec 找到这个功能。

有没有一种干净的方法可以按照我在这里起草的方式来做到这一点?是否有一些替代方法可以为此使用 openssl,例如,openssl lib 的一些本机绑定,这将允许我在不依赖命令行的情况下执行此操作?

T.J*_*der 5

你提到过,spawn但似乎认为你不能使用它。可能在这里显示了我的无知,但它似乎应该正是您要寻找的:通过 启动 openssl spawn,然后写入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);
}
Run Code Online (Sandbox Code Playgroud)