【问题标题】:NodeJS exec with binary from and to the processNodeJS exec 与进程的二进制文件
【发布时间】:2011-11-10 08:42:56
【问题描述】:

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

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

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

cat the_binary_file.data | openssl -encrypt -inkey key_file.pem -certin > the_output_stream

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

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

【问题讨论】:

    标签: javascript node.js exec rsa


    【解决方案1】:

    您提到了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);
    }
    

    【讨论】:

      【解决方案2】:

      当您调用 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'});
      

      我希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-20
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        相关资源
        最近更新 更多