HLS视频加密,让您的视频内容更安全!

 背景介绍

HLS视频加密是一种基于HTTP Live Streaming(HLS)协议的加密技术。它的核心思想是将视频切片进行加密处理,在客户端播放时需要先获取解密密钥才能正常偶发。通过这种方式,HLS加密可以有效防止未经授权的第三方窃取视频内容,从而保障了视频内容的版权和安全。数据万象媒体处理服务提供了一套HLS视频加密方案,方便用户各个场景的需求。

 HLS加密方案

整体加密方案如下图所示:

图片

 

痛点

在我们日常的工作生活中,如果没有HLS加密,会带来以下问题:

  • 视频内容被非法下载和分享:没有加密的视频内容容易被非法下载和分享,导致付费业务受到威胁。

  • 影响用户体验:为了提高视频的安全性,可能需要采用更复杂的验证和授权机制。这可能会增加用户的操作复杂度,降低用户体验。

  • 增加服务器的负担:如果采用客户端解密的技术,服务器需要处理更多的请求和计算量,可能会对延迟和性能造成一定的不良影响。

 使用场景

  • 直播赛事:体育赛事、音乐会等大型活动需要进行直播,HLS加密可以有效防止盗版和非法传播。

  • 在线教育:在线教育平台需要保护课程内容的版权,HLS加密可以确保课程内容不被非法窃取。

  • 付费视频:电影、电视剧等付费视频内容需要进行版权保护,HLS加密可以有效防止盗版行为。

  • 企业会议:企业的重要会议、内部培训等内容需要进行保密处理,HLS加密可以确保这些内容不被泄露。

 操作指南

生成加密视频

一、模版设置

1. 开通媒体处理

进入存储桶界面,点击数据处理中的媒体处理,点击开通。

图片

2. 创建HLS转码模版

点击任务与工作流里的模版配置,点击创建转码模版

2.1 输入模版名称,封装格式选择HLS。

图片

2.2 打开视频加密开关

视频参数和音频参数根据需要填写,在高级设置里打开视频加密开关

图片

二、创建转码任务

在当前存储桶上传任意视频文件,点击任务管理里的创建任务。

1. 生成m3u8加密文件

源文件路径选择刚刚上传的视频文件,模版类型选择自定义模版,选择第二步创建的hls转码模版,记住目标路径和目标文件名,产出文件就是我们需要的加密视频文件。

图片

2. 确定产物文件

找到创建任务时填的产物路径,可看到生成后的加密文件

图片

播放加密视频

控制台媒体处理,视频加密配置模块,展示播放密钥(playKey,部署后端服务的时候会用到)

图片

拿到生成的m3u8视频文件和播放秘钥(playKey)后,就可以开始搭建服务,播放刚刚加密的m3u8视频文件。

本文前端部分以js代码为例,服务端以nodejs为例,来说明整个使用过程。

三、前端部分

1. 首先下载hls加密代码包(https://bjtest-10008930.cos.ap-shanghai.myqcloud.com/hlsCode/hls%E5%8A%A0%E5%AF%86%E4%BB%A3%E7%A0%81%E5%8C%85.zip)

2. 在页面中引入压缩包中cos_hls.js、jsencrypt.js 和 hls.js。

3. 根据播放器种类,在页面中引入压缩包中文件,目前支持三种类型(hls.js/tcplayer/video.js)。

hls.js:

<script src="./cos_hls.js"></script>
<script src="./hls.js"></script> 
<script src="./jsencrypt.js"></script>

tcplayer:


<link href="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/tcplayer.min.css" rel="stylesheet"/>
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/libs/hls.min.0.13.2m.js"></script>
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.2/tcplayer.v4.2.2.min.js"></script>
<script src="./cos_hls.js"></script>
<script src="./jsencrypt.js"></script>

video.js:


<link href="https://vjs.zencdn.net/8.11.8/video-js.css" rel="stylesheet" />
<script src="https://vjs.zencdn.net/8.11.8/video.js"></script>
<script src="./cos_hls.js"></script>
<script src="./jsencrypt.js"></script>

4. 前端使用cos_hls.js文件中封装好的cosHls对象来播放m3u8文件,用户按照如下规则传入参数,即可实现播放功能。 


<script>// cosHLs为cos_hls.js封装的对象,使用play方法播放视频文件cosHls.play({// video标签的idcontainer: 'video',// 支持的播放器种类(hls.js/tcplayer/video.js)playerType: 'hls.js',// 请求m3u8接口的文件地址src: 'https://examplebucket-1250000000.cos.ap-beijing.myqcloud.com/hls/video.m3u8?ci-process=pm3u8',// 标记src里的域名是不是CDN域名(false/true)// useCdn: false,// 请求token和签名的函数getToken(opt, callback) {// 加密公钥,不需要用户填写,sdk会自动生成var publicKey = opt.publicKey;// 请求m3u8接口的文件地址,不需要用户填写,sdk会自动生成var src = opt.src;// 是否返回加密内容,与cosHls对象的ProtectContentKey参数保持一致,不需要用户填写,sdk会自动生成var protectContentKey = opt.ProtectContentKey;// 新建xhr对象,进行请求var xhr = new XMLHttpRequest();xhr.withCredentials = true;// /samples/hls/token为自定义请求地址,用户可自自定义xhr.open('POST', `/hls/token`, true);xhr.setRequestHeader('Content-Type', 'application/json')// 请求成功返回authorization 和 tokenxhr.onload = function () {var r = JSON.parse(xhr.responseText);var authorization = r.authorizationvar token = r.tokencallback(null, {authorization, token});};xhr.onerror = function () {callback('get token error');};// node服务所需要的参数,已从sdk获取,不需要用户填写var data = {src: src,publicKey: window.btoa(publicKey),protectContentKey: protectContentKey};xhr.send(JSON.stringify(data));}})
</script>
四、服务端部分

服务端,以 Nodejs 为例,主要代码如下:


const COS = require('cos-nodejs-sdk-v5');
const base64Url = require('base64-url');
const express = require('express');
const crypto = require('crypto');// 配置参数
const config = {// 获取腾讯云密钥,建议使用限定权限的子用户的密钥 https://console.cloud.tencent.com/cam/capisecretId: process.env.SecretId,secretKey: process.env.SecretKey,// 播放秘钥,可在媒体处理模块获取 https://console.cloud.tencent.com/cos/bucket?bucket=xxxx-100000&region=ap-xxx&type=ci&anchorType=videoplayKey: process.env.playKey,// 目标存储桶名称,可在存储桶列表页获取 https://console.cloud.tencent.com/cos/bucketbucket: 'xxx',// 目标存储桶地域,可在存储桶列表页获取 https://console.cloud.tencent.com/cos/bucketregion: 'xxx'
};// 创建临时密钥服务和用于调试的静态服务
const app = express();app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));router.post('/hls/token', (req, res, next) => {// 从接口拿到文件地址,加密公钥,是否返回加密内容const body = req.body;const src = body.src;const publicKey = body.publicKey;const protectContentKey = body.protectContentKey;// 如在某些特殊场景需要用HLS标准加密(例如小程序里播放/iOSWebview),可以去掉下面的限制判断并做好来源限制只允许小程序来源。// 代码示例只允许 protectContentKey 传 1,原因:如果允许传入 0 播放流程会走 HLS 标准加密会有风险。const userAgent = req.headers['user-agent'] || '';const uaWhiteList = ['Safari', 'wechatdevtools', 'MiniProgramEnv'];const isUaAllow = uaWhiteList.some(item => userAgent.includes(item));// 只有白名单的浏览器,才能走标准加密if (!protectContentKey && !isUaAllow) {res.status(400);return res.send({code: -1, message: 'protectContentKey=0 not allowed'});}// src 链接校验if (!src || !srcReg.test(src)) return res.send({code: -1, message: 'src format error'});if (!publicKey) return res.send({code: -1, message: 'publicKey empty'});// 解析 urlconst { bucket, region } = config;const { token, authorization } = getToken({publicKey, protectContentKey, bucket, region, src}, res)res.send({code: 0, message: 'ok', token, authorization});
});const srcReg = /^https?:\/\/([^/]+)\/([^?]+)/;
const ciHostReg = /^[^.]+\.ci\.[^.]+\.myqcloud\.com$/;function getToken({publicKey, protectContentKey, bucket, region, src}) {const m = src.match(srcReg);const srcHost = m[1];const pathKey = m[2];const query = {};const isCiHost = ciHostReg.test(srcHost);src.replace(/^([^?]+)(\?([^#]+))?(#.*)?$/, '$3').split('&').forEach(item => {const index = item.indexOf('=');const key = index > -1 ? item.slice(0, index) : item;let val = index > -1 ? item.slice(index + 1) : '';query[key] = decodeURIComponent(val);});let objectKey = isCiHost ? query.object : pathKey;const header = {"alg": "HS256","typ": "JWT"}const appId = bucket.slice(bucket.lastIndexOf('-') + 1);let payload = {Type: "CosCiToken",AppId: appId,BucketId: bucket,Issuer: "client",IssuedTimeStamp: Math.floor((new Date().getTime() - 30 * 1000) / 1000),ProtectSchema: "rsa1024",PublicKey: publicKey,ProtectContentKey: protectContentKey || 0,UsageLimit: 50,Object: objectKey,};let Header = base64Url.encode(JSON.stringify(header))let PayLoad = base64Url.encode(JSON.stringify(payload))let data = Header + "." + PayLoadlet hash = crypto.createHmac('sha256', config.playKey).update(data).digest();let Signature = base64Url.encode(hash);let token = Header + '.' + PayLoad + '.' + Signaturelet authorization = COS.getAuthorization({SecretId: config.secretId,SecretKey: config.secretKey,Method: 'get',Pathname: `/${objectKey}`,Query: {'ci-process': 'pm3u8'},});return {token, authorization};
}

五、效果体验

完成前后端的代码后,启动服务,即可开始播放加密视频。

图片

在线体验地址: 

https://cos.cloud.tencent.com/samples/hls/private-encrypt/

方案接入优势

  • 接入简单:支持多个开源通用播放器,定制化能力强。

  • 支持场景丰富:PC Web、Android WebView,Android/iOS移动端App

  • 不兼容的场景自动降级:因为 iOS Webview 不兼容 Media Source Extensions,会自动降级为标准加密方案。减少开发兼容成本。

总结

数据万象媒体处理新增视频加密,旨在让用户能够更加方便地使用视频加密功能,提高用户体验。同时,我们也会继续关注用户的反馈,不断优化和改进数据万象媒体处理的用户体验,为用户提供更好的服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM大模型的7种推理框架分析

LLM的7种推理框架 Hugging Face的transformers 这是一个Python库&#xff0c;可以简化本地运行LLM的过程。 Transformers的优点&#xff1a; 自动模型下载提供代码片段非常适合实验和学习 Transformers的缺点&#xff1a; 需要对ML和NLP有深入了解需要编码和配置技能 2.L…

深度学习之基于Tensorflow低光增强的深层Retinex分解

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域&#xff0c;低光照环境下的图像增强是一个具有挑战性的问题。为了提高图像的可…

纽曼新品X1000:轻巧便携仅重9.9公斤的1度电应急电源

在户外救援行动和应急设备中&#xff0c;电力供应的稳定性和安全性直接影响到救援工作的效率和成功率。在现代救援工作中&#xff0c;常见的光学声波探测仪、通信联络设备、气象检测仪、生命探测仪、照明设备等装备均需有持续的电力供应&#xff0c;才能保障救援工作的有序开展…

西门子WINCC8.0VBS脚本学习讲解

WinCC VBS脚本置位/复位/取反 二进制变量 "TAG1_BOOL1" 进行置位复位取反操作 步骤&#xff1a;按钮-->对象属性-->事件-->单击鼠标VBS动作填入代码如下: 对二进制变量进行复位 对二进制变量进行置位 对二进制变量进行取反 VBS脚本数学运算/读写批处理 …

第十六讲:数据在内存中的存储

第十六讲&#xff1a;数据在内存中的存储 1.整数在内存中的存储1.1存储方式1.2大小端字节序1.3大小端字节序排序规则1.4为什么要有大小端1.5练习1.5.1练习11.5.2练习21.5.3练习31.5.4练习41.5.5练习51.5.6练习61.5.7练习7 2.浮点数在内存中的存储2.1练习2.2浮点数的存储2.3浮点…

如何将数据从一部手机传输到另一部手机[安全快速]

概括 手机之间无需使用蓝牙即可传输文件&#xff0c;配合专业的文件传输工具更高效。本文将向您介绍几种使用不同的数据传输工具快速安全地将数据从一部手机传输到另一部手机的方法&#xff0c;特别是当有大文件或大量文件时。现在&#xff0c;我们来看看。 需要在朋友或家人之…

Rust 赋能前端 -- 写一个 File 转 Img 的功能

所有耀眼的成绩,都需要苦熬,熬得过,出众;熬不过,出局 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 Rustwasm-bindgen/js-sys/web-sysWeb WorkerWebAssemblyWebpack/Vite配置WebAssemblyOffscreenCanvas脚手架生成项…

校园二手书交易|基于SprinBoot+vue的校园二手书交易管理系统(源码+数据库+文档)

校园二手书交易管理系统 目录 基于SprinBootvue的校园二手书交易管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3 卖家用户功能模块 4 用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八…

基于springboot+html的二手交易平台(附源码)

基于springboothtml的二手交易平台 介绍部分界面截图如下联系我 介绍 本系统是基于springboothtml的二手交易平台&#xff0c;数据库为mysql&#xff0c;可用于毕设或学习&#xff0c;附数据库 部分界面截图如下 联系我 VX&#xff1a;Zzllh_

在家庭影院音频中应用的D类音频放大器

家庭影院的主要组成部分包括显示设备、音响设备、信号源和接线设备等。家庭影院的音响信号需要进行处理和输出&#xff0c;以获得高质量的音效。音响设备通常需要一台功率适当的数字、模拟混合的处理器&#xff0c;对音源进行降噪、均衡、扩展等处理操作&#xff0c;以达到高品…

【智能算法应用】北方苍鹰算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】北方苍鹰优化算法&#xff08;NGO)原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#xff0c;可通过的…

ping 探测网段哪些地址被用

#!/bin/bash# 遍历192.168.3.1到192.168.3.254 for i in {1..254} doip"192.168.3.$i"# 对每个IP地址进行三次ping操作if ping -c 3 -W 1 $ip > /dev/null 2>&1thenecho "$ip: yes"fi done$ sh test.sh 192.168.3.1: yes 192.168.3.95: yes 192.…

使用Word表格数据快速创建图表

实例需求&#xff1a;Word的表格如下所示&#xff0c;标题行有合并单元格。 现在需要根据上述表格数据&#xff0c;在Word中创建如下柱图。如果数据在Excel之中&#xff0c;那么创建这个图并不复杂&#xff0c;但是Word中就没用那么简单了&#xff0c;虽然Word中可以插入图表&a…

014_C标准库函数之<stdio.h>

【背景】 今天这个主要说的是<stdio.h>头文件&#xff0c;大家众所周知&#xff0c;这个是我们学习C语言时第一个接触到的头文件了&#xff0c;那么为什么我不一开始就介绍这个头文件呢&#xff1f;我觉得有两个原因&#xff0c;如下&#xff1a; 1.一开始大家的编程思…

LeetCode/NowCoder-链表经典算法OJ练习3

孜孜不倦&#xff1a;孜孜&#xff1a;勤勉&#xff0c;不懈怠。指工作或学习勤奋不知疲倦。&#x1f493;&#x1f493;&#x1f493; 目录 说在前面 题目一&#xff1a;返回倒数第k个节点 题目二&#xff1a;链表的回文结构 题目三&#xff1a;相交链表 SUMUP结尾 说在前…

MySQL库/表/数据的操作

文章目录 1.数据库操作1.1 创建、删除、查看和修改1.2 编码格式1.3 备份和恢复 2.表的操作2.1 创建表2.2 存储引擎2.3 查看表、修改表、删除表 3.数据类型3.1整数类型3.2字节类型(bit)3.3浮点类型(bit)3.4 decimal3.5 字符串类型3.6 日期和时间类型3.7 enum和set关于如何查找想…

Python中别再用 ‘+‘ 拼接字符串了!

大家好&#xff0c;在 Python 编程中&#xff0c;我们常常需要对字符串进行拼接。你可能会自然地想到用 操作符将字符串连接起来&#xff0c;毕竟这看起来简单明了。 在 Python 中&#xff0c;字符串是不可变的数据类型&#xff0c;这意味着一旦字符串被创建&#xff0c;它就…

【Python】—— lambda表达式

目录 &#xff08;一&#xff09;应用场景 &#xff08;二&#xff09;lambda 语法 &#xff08;三&#xff09;示例分析 &#xff08;四&#xff09;lambda参数形式 4.1 无参数 4.2 一个参数 4.3 默认参数 4.4 可变参数 &#xff1a;*args 4.5 可变参数 &#xff1a;…

基于Matlab实现BP神经网络的手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是计算机视觉和模式识别领域的一个经典问题&#xff0c;具有广泛的应用场景&…

信息安全从业者书单推荐

作为一名网安人&#xff0c;身上肩负的责任是很大的&#xff0c;能力越大&#xff0c;责任也越大&#xff0c;反过来责任越大&#xff0c;能力也必须跟得上。不管是想进这行&#xff0c;还是已经在这行&#xff0c;持续学习肯定是不能缺少的&#xff0c;除了在工作中积累&#…