NodeJS exec с бинарным от и до процесса - PullRequest
1 голос
/ 10 ноября 2011

Я пытаюсь написать функцию, которая бы использовала нативный openssl для выполнения тяжелой работы RSA вместо меня, вместо использования библиотеки js RSA.Цель -

  1. Считать двоичные данные из файла
  2. Выполнить некоторую обработку в процессе узла, используя JS, в результате чего получится буфер, содержащий двоичные данные
  3. Записьбуфер в поток stdin команды exec
  4. RSA шифрует / дешифрует данные и записывает их в поток stdout
  5. Получает входные данные обратно в буфер в JS-процессе для дальнейшегообработка

Дочерний модуль процесса в Node имеет команду exec, но мне не удается понять, как я могу передать входные данные процессу и передать его обратно моему процессу.По сути, я хотел бы выполнить следующий тип команды, но без необходимости полагаться на запись файлов (не проверял точный синтаксис openssl)

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

Я мог бы сделать это, написаввременный файл, но я бы хотел избежать его, если это возможно.Создание дочернего процесса позволяет мне получить доступ к stdin / out, но не нашел эту функцию для exec.

Есть ли чистый способ сделать это так, как я здесь написал?Есть ли какой-нибудь альтернативный способ использования openssl для этого, например, некоторые нативные привязки для openssl lib, которые позволили бы мне сделать это, не полагаясь на командную строку?

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Вы упомянули 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);
}
1 голос
/ 09 мая 2014

Вы должны иметь возможность установить двоичную кодировку при вызове 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'});

Надеюсь, это поможет!

...