加密文件流和管道到 http 响应

问题描述

我想加密一个文件并将其作为 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,iv);
    const src = fs.createReadStream('./big.file');
    src.pipe(cipher).pipe(res);
});

server.listen(8000);