Я пытаюсь сделать так, чтобы базовый сервер 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, но это также не сработало.