hls视频生成及加密方案研究

本文探讨了一个项目中实现在线视频播放并防止下载的需求,选择了通过HLS生成视频分片并加密的方案。详细介绍了如何使用ffmpeg生成原始分片,以及采用openssl手动加密视频分片的两种方法,包括默认IV和自定义IV。此外,还讨论了进一步防止下载的策略,如权限验证和索引文件与密钥文件的二次加密。

工作中的一个项目需要实现视频在线播放并防止下载。研究目前主流方案以后,决定采用HLS生成视频分片并手动加密的方案。这篇文章记录了研究过程中遇到的问题,以及最后的结果。仅供以后参考。

采用ffmpeg生成HLS原始视频分片

ffmpeg是一个强大的媒体文件处理工具,用它可以方便的生成HLS视频分片。

生成未加密的视频分片命令

ffmpeg -i demo.mp4 -codec copy -f segment -segment_list index.m3u8 -segment_time 30 segment_%d.ts

-i 输入文件
-codec 选择输入文件解码器或输出文件编码器。copy用于输出文件,表示保留输入文件编码无需重新编码。
-f 指定输入或输出文件格式。选择segment,表示视频切片。
-segment_list 指定视频切片索引文件。
-segment_time 指定视频切片时长。
segment_%d.ts 最后指定切片文件命名格式

参考代码,运行plain.sh即可完成视频分片
参考生成资源,可使用安装了Native HLS Playback插件的chrome直接播放。

生成加密的视频分片

未加密的视频分片可以直接播放,用户获得视频分片后可以

<think>我们参考了多个来源,特别是阿里云和腾讯云的相关文档,来构建腾讯云HLS私有加密的操作指南。腾讯云的HLS私有加密通常涉及到以下几个步骤:生成密钥、创建加密模板、发起加密转码任务、搭建密钥派发服务(令牌服务)以及在前端播放器中集成解密能力。 ### 1. 生成密钥 首先,你需要生成一个用于加密的密钥。通常使用AES-128加密,因此密钥长度为16字节。你可以使用OpenSSL生成: ```bash openssl rand 16 > encrypt.key ``` 同时,生成一个密钥的初始向量(IV,可选): ```bash openssl rand -hex 16 ``` ### 2. 创建加密模板 在腾讯云点播控制台中,你需要创建一个加密模板,指定加密方式为HLS私有加密(即只有经过授权的用户才能获取密钥解密播放)。 - 登录[腾讯云点播控制台](https://console.cloud.tencent.com/vod)。 - 进入“视频处理设置”->“模板设置”->“转码模板”,点击“创建转码模板”。 - 在加密部分,选择“HLS私有加密”,并填写密钥相关配置(注意:腾讯云要求你提供一个密钥管理服务的URL,用于在播放时动态获取密钥)。 ### 3. 发起加密转码任务 使用腾讯云API发起转码任务,并指定加密模板。以下是一个PHP示例(其他语言类似): ```php use TencentCloud\Vod\V20180717\Models\MediaProcessTaskInput; use TencentCloud\Vod\V20180717\Models\TranscodeTaskInput; use TencentCloud\Vod\V20180717\Models\AesKeyInfo; use TencentCloud\Vod\V20180717\Models\SubmitTranscodeJobsRequest; function submitTranscodeJobs($vid) { $client = initVodClient('your-secret-id', 'your-secret-key'); // 初始化客户端 $request = new SubmitTranscodeJobsRequest(); // 设置视频ID $request->VideoId = $vid; // 设置加密模板ID(在控制台创建的加密模板ID) $request->TemplateId = 'your-encrypt-template-id'; // 设置加密密钥(可选,如果模板中已配置密钥服务则不需要) // $aesKeyInfo = new AesKeyInfo(); // $aesKeyInfo->Key = '你的密钥(Base64编码)'; // $aesKeyInfo->Iv = '你的初始向量(Base64编码)'; // $request->AesKey = $aesKeyInfo; $response = $client->SubmitTranscodeJobs($request); return $response; } ``` 注意:在实际使用中,通常不需要在转码请求中直接传递密钥,而是通过密钥派发服务动态提供。 ### 4. 搭建密钥派发服务(令牌服务) 腾讯云HLS私有加密要求你提供一个密钥派发服务,用于在播放器请求时返回密钥。这个服务需要做以下事情: - 验证请求的合法性(例如,通过Token验证用户权限)。 - 返回密钥和IV(如果有)。 一个简单的PHP密钥派发服务示例: ```php <?php $key = file_get_contents('/path/to/your/encrypt.key'); // 二进制密钥 $iv = hex2bin('你的16进制IV'); // 如果生成IV时是16进制字符串,需要转换 // 验证Token(示例,实际根据业务逻辑验证) $token = $_GET['token']; if (!validateToken($token)) { header('HTTP/1.1 403 Forbidden'); exit; } // 返回密钥 header('Content-Type: application/octet-stream'); echo $key; ``` 然后,将这个服务部署在一个安全的HTTPS地址上。 ### 5. 前端播放器集成 在前端,你需要使用支持HLS解密的播放器。腾讯云推荐使用[TCPlayer](https://cloud.tencent.com/document/product/881/20207),并配置加密参数。 ```html <video id="player"></video> <script src="//imgcache.qq.com/open/qcloud/video/vcplayer/TcPlayer-2.3.2.js"></script> <script> var player = new TcPlayer('player', { m3u8: "https://your-domain.com/path/to/video.m3u8", // 加密后的m3u8地址 key_url: "https://your-key-server.com/key.php?token=用户令牌", // 密钥派发服务地址 // 其他配置... }); </script> ``` 注意:`key_url`需要动态生成,其中包含用户的授权令牌(token),以确保只有授权用户才能获取密钥。 ### 安全建议 - 密钥派发服务必须进行严格的权限验证,防止密钥泄露。 - 使用HTTPS来保护密钥传输过程。 - 定期更换密钥。 以上就是腾讯云HLS私有加密的基本操作流程。具体细节请参考[腾讯云官方文档](https://cloud.tencent.com/document/product/266/14058)。 §§相关问题§§ 1. 如何验证腾讯云HLS私有加密的有效性? 2. 除了HLS私有加密,腾讯云还提供哪些视频加密方案? 3. 如何在前端播放器中处理多个加密视频的密钥获取?</think>### 腾讯云 HLS 私有加密操作指南 腾讯云 HLS 私有加密通过 AES-128 标准对视频切片进行加密,确保只有授权用户可通过密钥解密播放。以下是完整操作流程: #### 一、准备工作 1. **开通服务** - 登录[腾讯云点播控制台](https://console.cloud.tencent.com/vod) - 开通「视频加密」功能(需企业认证账号) 2. **生成密钥** 使用 OpenSSL 生成 16 字节加密密钥: ```bash openssl rand 16 > encrypt.key # 二进制密钥 openssl rand -hex 16 # 生成16进制密钥(用于后续配置) ``` #### 二、创建加密模板 1. **新建加密模板** - 控制台路径:`视频处理设置` → `模板设置` → `加密模板` - 点击**创建加密模板**,配置参数: ```json { "加密类型": "HLS私有加密", "密钥来源": "自主托管", // 选择自建密钥服务 "密钥URL": "https://your-domain.com/key-service?token={Token}", // 密钥派发接口 "IV值": "生成16进制IV" // 可选 } ``` - 保存后获取模板 ID(如 `t123456789`) #### 三、发起加密转码 1. **API 调用加密转码**(Python 示例) ```python from tencentcloud.vod.v20180717 import VodClient, models cred = {"SecretId": "AKIDxxxx", "SecretKey": "xxxx"} client = VodClient(cred, "ap-shanghai") req = models.ProcessMediaRequest() req.VodSessionKey = "video-001" # 视频唯一标识 req.TranscodeTask = models.TranscodeTaskInput( Definition=100010, # 基础转码模板ID Encryption=models.AesEncryption( Type="HLS_PRIVATE", # HLS私有加密 KeyUrl="https://your-domain.com/key-service", # 密钥服务地址 TemplateId="t123456789" # 加密模板ID ) ) resp = client.ProcessMedia(req) print(resp.TaskId) ``` 2. **控制台操作** - 上传视频 → 选择「转码」→ 添加任务 → 勾选「加密模板」→ 选择创建的模板 #### 四、搭建密钥派发服务 1. **密钥服务接口示例(Node.js)** ```javascript const express = require('express'); const fs = require('fs'); const app = express(); // 密钥验证中间件 app.get('/key-service', (req, res) => { const token = req.query.token; if (!validateToken(token)) { // 自定义令牌验证逻辑 return res.status(403).send("Forbidden"); } const key = fs.readFileSync('/path/to/encrypt.key'); res.set('Content-Type', 'application/octet-stream'); res.send(key); }); function validateToken(token) { // 实现令牌验证(如JWT校验、时效验证等) return true; } app.listen(443, () => console.log('Key Service Running')); ``` #### 五、前端播放器集成 1. **HLS.js 播放器配置** ```html <script src="https://cdn.jsdelivr.net/npm/hls.js@1.0.0"></script> <video id="video"></video> <script> const video = document.getElementById('video'); const hls = new Hls({ drmSystemOptions: { getKey: (keyUri) => { return fetch(`${keyUri}&token=${userToken}`) // 动态附加用户令牌 .then(res => res.arrayBuffer()) } } }); hls.loadSource('https://vod-video.m3u8'); // 加密视频地址 hls.attachMedia(video); </script> ``` #### 六、安全增强措施 1. **动态令牌验证** - 密钥服务需验证 URL 中的 `token` 参数 - 建议结合腾讯云**签名鉴权**([参考文档](https://cloud.tencent.com/document/product/266/33961)) 2. **防盗链配置** - 在点播控制台开启 `Referer 防盗链` 和 `Key 防盗链` - 限制仅允许指定域名访问加密视频 #### 注意事项 1. 密钥服务必须通过 **HTTPS** 部署 2. 播放端需集成支持 AES-128 解密的播放器(推荐 [hls.js](https://github.com/video-dev/hls.js)) 3. 密钥需定期轮换(通过更新加密模板实现) > 完整操作文档:[腾讯云视频加密指南](https://cloud.tencent.com/document/product/266/14058) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值