Потоковое видео, зашифрованное AES GCM в NodeJs - PullRequest
3 голосов
/ 11 февраля 2020

У меня есть код для потоковой передачи незашифрованного видео с S3, теперь я хочу, чтобы он работал для зашифрованных видеофайлов, для этого я использую AES GCM.

Однако проигрыватель html5 не может воспроизвести его , Я попытался расшифровать полный файл, и он работал (без потоковой передачи). Любые предложения будут оценены. Код для Hapis JS.

      const file = 'test/movie.mp4.enc';
      const s3Bucket = new S3();
      const paramsWholeFile = { Bucket: 'mybucket-v1', Key: file};
      const headWholeFile = await s3Bucket.headObject(paramsWholeFile).promise();
      const fileSize = headWholeFile.ContentLength!;

      const range = req.headers.range;
      console.log(range);

      const parts = range.replace(/bytes=/, "").split("-")
      let start = parseInt(parts[0], 10);
      if (start > 0) {
        start -= (start % 16); // reading from the beginning of AES block
      }

      let end = parts[1]
        ? parseInt(parts[1], 10) - parseInt(parts[1], 10) % 16 # reading until the latest AES block
        : fileSize - 1;

      const chunksize = (end - start) + 1;
      //const file = Fs.createReadStream(path, {start, end})
      const params = { Bucket: 'mybucket-v1', Key: file, Range: `bytes=${start}-`};
      const object = s3Bucket.getObject(params);
      const stream = object.createReadStream();

      const dataKey = await CipherService.getDataKey(headWholeFile.Metadata!['x-amz-key']);
      const authTag = headWholeFile.Metadata!['x-amz-auth-tag'];

      const iv = new Buffer(headWholeFile.Metadata!['x-amz-iv'], 'base64');
      const decipher = Crypto.createDecipheriv(
        'aes-256-gcm',
        dataKey.Plaintext as Buffer,
        iv
      );
      decipher.setAuthTag(new Buffer(authTag , 'base64'));
      const decryptedStream = stream.pipe(decipher);

      const response = h.response(decryptedStream).code(206);
      response.header('Content-Range', `bytes ${start}-${end}/${fileSize}`);
      response.header('Accept-Ranges', `bytes`);
      response.header('Content-Length', `${chunksize}`);
      response.header('Content-Type', `video/mp4`);
      return response;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...