He creado un proxy http en nodejs usando el paquete http-proxy. Lo que quiero hacer a través de este proxy es escuchar la solicitud que llega al proxy, cifrar el contenido del archivo y reenviarlo al servicio respectivo. Entonces estoy usando el evento proxyReq para escuchar la solicitud que llega al proxy. e intentando cifrar el archivo en la solicitud.

const { createEncryptStream, setPassword } = require('aes-encrypt-stream');
const PassThroughStream = require('stream').PassThrough;

proxy.on('proxyReq', (proxyReq, pReq, pRes) => {
    setPassword(Buffer.from(pReq.encryptionKey, 'hex'));
    const stream = new PassThroughStream();
    createEncryptStream(pReq).pipe(stream);
});

No soy tan bueno con las transmisiones, pero ¿cómo cifro los archivos en la solicitud y los reenvío? Probé varias soluciones para fragmentar el contenido del archivo en caso de datos de múltiples partes / formularios y reenviarlo, pero eso usa mucho la memoria. Así que estoy buscando una solución en la que pueda cifrar la transmisión.

1
Bibek Koirala 24 feb. 2021 a las 18:15

1 respuesta

La mejor respuesta

En términos de uso de memoria, el problema con el código que muestra aquí es que la transmisión almacenará en búfer todos los datos entrantes.

Suponiendo que targetRequestStream es la solicitud ascendente y targetResponseStream es la respuesta ascendente. Esto asegurará que los datos estén encriptados y enviados al servidor de destino a medida que se leen. Y la respuesta se descifra y se envía al cliente a medida que se recibe.

const { createEncryptStream, setPassword } = require('aes-encrypt-stream');
proxy.on('proxyReq', (proxyReq, pReq, pRes) => {
    setPassword(Buffer.from(pReq.encryptionKey, 'hex'));
    createEncryptStream(pReq).pipe(targetRequestStream);
    createDecryptStream(targetResponseStream).pipe(pRes)
});

Otra forma de evitar que todos los datos se almacenen en búfer es agregar un detector de eventos add a data.

const { createEncryptStream, setPassword } = require('aes-encrypt-stream');
proxy.on('proxyReq', (proxyReq, pReq, pRes) => {
    setPassword(Buffer.from(pReq.encryptionKey, 'hex'));
    createEncryptStream(pReq)
      .on('data', (data) => { /*handle encrypted data here */});
    createDecryptStream(targetResponseStream)
      .on('data', (data) => { /* handle decrypted data here */ });
});
2
user12750353 5 mar. 2021 a las 11:17