加密文件流并通过管道传输到 http 响应

Encrypt file stream and pipe to http response

我想加密文件并将其作为即时的 http 响应。

我目前的工作流程是这样的。

const fs = require('fs');
const server = require('http').createServer();

server.on('request', (req, res) => {
  const src = fs.createReadStream('./big.file');
  src.pipe(res);
});

server.listen(8000);

我想在将流传输到响应之前对其进行加密。我知道我必须使用转换流,但我确定正确的实现方式。

这在 Node.js 中得到了很好的支持,加密文档中有一个关于这个主题的部分非常有用:https://nodejs.org/dist/latest-v14.x/docs/api/crypto.html(示例:使用密码和管道流):

const cipher = crypto.createCipheriv(algorithm, key, iv);

const input = fs.createReadStream('test.js');
const output = fs.createWriteStream('test.enc');

input.pipe(cipher).pipe(output);

上面的示例将文件读取流通过管道传输到文件写入流,这与通过管道传输到 http 响应一样容易,如下所示:

const crypto = require("crypto");
const fs = require("fs");

// Using 256-bit AES here 
const algorithm = "aes-256-cbc";
const key = Buffer.from("22975a65b34aefb6227084727f27bfae234d1be463d1e2f2cc611820e5aa5772", "hex");
const iv = Buffer.from("979843777c873b5a2060c2ad968a20d9", "hex");

const server = require('http').createServer();

server.on('request', (req, res) => {
    const cipher = crypto.createCipheriv(algorithm, key, iv);
    const src = fs.createReadStream('./big.file');
    src.pipe(cipher).pipe(res);
});

server.listen(8000);