我们如何在节点 http 代理中使用 AES 加密文件?

How do we encrypt a file with AES in node http proxy?

我使用 http-proxy 包在 nodejs 中创建了一个 http 代理。我想通过这个代理做的是听取代理的请求,加密文件内容并将其转发到相应的服务。所以我正在使用 proxyReq 事件来侦听来自代理的请求。并尝试加密请求中的文件。

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);
});

我不太擅长流,但我如何加密请求中的文件并转发它?我尝试了各种解决方案,将 multipart/form-data 的文件内容分块并转发它,但广泛使用内存。所以我正在寻找一种可以在流中加密的解决方案。

就内存使用而言,您在此处显示的代码存在的问题是流将缓冲所有传入数据。

假设targetRequestStream是上游请求,targetResponseStream是上游响应。这将确保数据在读取时被加密并发送到目标服务器。响应在收到时被解密并发送给客户端。

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)
});

防止所有数据缓冲的其他方法是添加一个 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 */ });
});