У меня есть код для потоковой передачи незашифрованного видео с 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;