Труба от стандартного ввода до шифра, чтобы застегнуть на розетку и обратно - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь сделать так, чтобы базовый сервер node.js и клиент обменивались данными с помощью шифрования / дешифрования с помощью сжатия gzip с использованием каналов.

Он отлично работает без сжатия в миксе, как показано на примерах кода ниже.

Я не могу заставить его работать с потоками сжатия в миксе. Это просто висит. Я думаю, что поток zip не смывает, но я не совсем уверен. Я уверен, что есть простой ответ и, возможно, небольшой фрагмент, который нужно добавить, чтобы заставить его работать, но я не могу найти никаких примеров чего-то такого, что вместе взятые.

Фрагменты, которые я склеил из двух разных примеров: один для сокета / клиента с каналом, а другой для потоков gzip / cipher из / в fs.read и потоков записи.

Без сокета версия файлового потока работает, но потоковая передача через сокеты, похоже, не работает со сжатием zip - хотя она прекрасно работает только с шифром.

Как я могу заставить это работать с этим по каналу? Возможно, я мог бы использовать слушателя, чтобы сделать это вручную, но это не цель.

Я ищу решение, которое позволит мне использовать прямую цепь трубопровода.

Идеи кого-нибудь? Я уверен, что я не единственный, кто смотрит - может быть, это поможет и другим.

Краткое объяснение вместе с решением было бы сверхфрагически благородным!

Сервер:

#!/usr/bin/node
// Modified from https://gist.github.com/chris-rock/335f92742b497256982a
// and https://gist.github.com/tedmiston/5935757


var crypto = require('crypto'),
    algorithm = 'aes-256-ctr',
    password = 'd6F3Efeq';

var zlib = require('zlib');

var net = require('net');




var server = net.createServer((socket)=>{

  var zip = zlib.createGzip();
  var encrypt = crypto.createCipher(algorithm, password);

  var decrypt = crypto.createDecipher(algorithm, password)
  var unzip = zlib.createGunzip();

  // this works
  process.stdin  .pipe(encrypt)  .pipe(socket);
  socket         .pipe(decrypt)  .pipe(process.stdout);


  // this doesn't
//  process.stdin  .pipe(zip)      .pipe(encrypt)  .pipe(socket);
//  socket         .pipe(decrypt)  .pipe(unzip)    .pipe(process.stdout);

});

server.listen(21337, '127.0.0.1');

Клиент:

#!/usr/bin/node
// Modified from https://gist.github.com/chris-rock/335f92742b497256982a
// and https://gist.github.com/tedmiston/5935757    

var crypto = require('crypto'),
    algorithm = 'aes-256-ctr',
    password = 'd6F3Efeq';

var zlib = require('zlib');

var net = require('net');




var socket = new net.Socket();
socket.connect(21337, '127.0.0.1', ()=>{

  var zip = zlib.createGzip();
  var encrypt = crypto.createCipher(algorithm, password);

  var decrypt = crypto.createDecipher(algorithm, password)
  var unzip = zlib.createGunzip();

  // this works
  process.stdin  .pipe(encrypt)  .pipe(socket);
  socket         .pipe(decrypt)  .pipe(process.stdout);


  // this doesn't
//  process.stdin  .pipe(zip)      .pipe(encrypt)  .pipe(socket);
//  socket         .pipe(decrypt)  .pipe(unzip)    .pipe(process.stdout);

});

Примечание: я также попытался изменить порядок на stdin-encrypt-zip-socket и socket-unzip-decrypt-stdout, но это также не сработало.

...