为什么要加密
视频采用m3u8 ts切片方式,采用切片默认的aes-128加密方式不安全,key值也是16位明文的,随便下个video.js插件就可以破解(其它播放插件也可以),让后端做来源判断或者加请求标识个人感觉安全系数也不是很大。
m3u8视频防盗方案
方案一:
后端对m3u8返回内容进行加密处理,前端请求m3u8时可以包括加SIGN验证,根据视频id加请求参数验证等,以便后端判断请求是否给你返回内容。
方案二:
如果感觉第一种麻烦可以让后端对key进行特殊二次加密(当然前提是前端知道后端是如何加密的以方便如何解密)
var handleKeyResponse = function handleKeyResponse(segment, objects, finishProcessingFn) {
return function (error, request) {
var response = request.response;
var errorObj = handleErrors(error, request);
if (errorObj) {
return finishProcessingFn(errorObj, segment);
}
/**
*
* 1、咔咔咔写自己拿到key返回内容进行解密
* 2、最后得到的是一个16位字符串
* 3、必须将字符串转换为ArrayBuffer
* 注:假如某个节视频key解密后为 2y7d9iwu8rc3fa0x
*/
//字符串转字符串ArrayBuffer
function str2ab(s,f) {
var b = new Blob([s],{type:'text/plain'});
var r = new FileReader();
r.readAsArrayBuffer(b);
r.onload = function (){if(f)f.call(null,r.result)}
}
// 此处是为了演示,实际应该填写每次解密后的字符串变量
str2ab('2y7d9iwu8rc3fa0x',function(ab){
//ab为ArrayBuffer
var view = new DataView(ab);
var bytes = new Uint32Array([view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12)]);
console.log(bytes);
for (var i = 0; i < objects.length; i++) {
objects[i].bytes = bytes;
}
return finishProcessingFn(null, segment);
});
// 将原来的方法注释掉
// var view = new DataView(new Int8Array(hexAesStr('516aa4d465a4085baddcac890cbcbf7e')).buffer);
// var bytes = new Uint32Array([view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12)]);
// for (var i = 0; i < objects.length; i++) {
// objects[i].bytes = bytes;
// }
// return finishProcessingFn(null, segment);
};
};版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
关注微信公众号:"cq_xifan";