为什么要加密
视频采用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";