付费视频被人薅走?了解一下hls视频加密

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

前言

作者现在主要负责的项目是通过音视频等课程提高教师职业能力的,说白了就是给老师卖课赚钱。大家都知道知识付费现在还是很火的,既然是要付费的知识,就肯定有人想白嫖,直接去下载课程里面音视频。业界就有很多工具,比如说IDM、NeatDM、迅雷等等(再多说就是在教大家犯罪了哈哈,大家千万不要点开),产品经理就说要做音视频加密。

技术选型

项目主要是移动端H5,发现因为浏览器兼容性的问题,很多防盗方案都不好做。如果直接使用原生播放视频,就不能够控制视频源的请求。只能由浏览器自己去拉流,没啥操作的余地。想要解决这个问题,就要用到 MSE(Media Source Extensions),基于 XHR 请求动态构造音视频源,大家可以简单了解一下先不用太深入。 但是呢,MSE 这玩意又有很多兼容性问题,比如说在 IOS Safari浏览器上不支持:
付费视频被人薅走?了解一下hls视频加密 插图1
柳暗花明又一村,IOS 原生支持一种叫 HLS 的视频协议,他是可以做媒体加密的。一起看下他的兼容性:
付费视频被人薅走?了解一下hls视频加密 插图2
虽然说红了一片,但是它和 MSE 的兼容性互补呀,其他浏览器可以基于 MSE 实现 HLS 视频播放,IOS浏览器直接用原生的,那不就行了。 业界有很多库可以实现 HLS 音视频的播放,比如说hls.js、video.js、xgplayer、chimee等等。我选用的是hls.js,原因很简单,就是轻量。其它的库会有其定制的UI和内置插件,不够纯粹。
付费视频被人薅走?了解一下hls视频加密 插图3
上图使用的是 https://bundlephobia.com/ 分析的,用起来很顺手,给大家安利一下。

HLS协议

HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于HTTP的自适应码率流媒体传输协议,包括m3u(8)的索引文件,TS媒体分片文件和key加密串文件,可用于实时媒体流的传输。
好,看下面这个图
付费视频被人薅走?了解一下hls视频加密 插图4
可以看到由三个部分组成,分别是Master Playlist、Media Playlist、Media Segments,似乎长得都差不多,展开讲讲是什么。 先说说 Master Playlist 和 Media Playlist 这两分别叫一级索引文件二级索引文件,在上图中可以看到后缀都是.m3u8,一级索引文件可以存放多个二级索引文件。在播放器“播放”的其实是二级索引文件, <video>标签的src属性定义为二级索引文件的URI就能播放,如下图:
<video src="https://www.ge69.com/${%E4%BA%8C%E7%BA%A7%E7%B4%A2%E5%BC%95%E6%96%87%E4%BB%B6%E9%93%BE%E6%8E%A5}">
既然播放的是二级索引文件,那一级索引文件有什么用呢?为什么需要存放了多个二级索引文件? 一级索引文件内部的多个二级索引文件的码率是不同的,码率越高清晰度一般越高。当<video>标签的src属性定义为一级索引文件的URI,播放器会根据当前的带宽网速,自动选择合适清晰度的二级索引文件来播放,这就是hls的功能——码率自适应。这块会在我的其他文章中重点讲解。 二级索引文件包含多个Meida Segments,也就是媒体片段, 他才是真正含有音视频内容,我们看到的视频画面其实来源于他。媒体片段经过解封装、解码、音视频同步,画面最后在浏览器渲染。 好啦,基本的理论已经有所了解,一起来看看实际案例。

边学边做

hls.js 提供了一个demo站点,让大家快速了解hls协议。 帅哥美女们,打开 hls.js demo 后点击 Apply 播放demo的视频。
付费视频被人薅走?了解一下hls视频加密 插图5
然后用chrome的devtool抓包,
付费视频被人薅走?了解一下hls视频加密 插图6
上图的就是一级索引文件,他的内容其实就是不同码率的m3u8。
付费视频被人薅走?了解一下hls视频加密 插图7
可以看到,浏览器选择了其中一个二级索引文件播放。由于刚才说到hls协议的码率自适应能力,浏览器实时判断网速,又选择了另一个码率更合适的二级索引文件播放。 上图的右边部分可以看到有很多的.ts后缀的文件,是上面提到的媒体片段

视频解密

回到一开始的界面,选择“AES-128 encrypted, ABR”,意思是视频采用了AES-128 的加密算法。
付费视频被人薅走?了解一下hls视频加密 插图8
播放视频后,同样进行抓包,可以看到二级索引文件中会有#EXT-X-KEY这个标签,里面就有获取密钥的URI。在浏览器请求到密钥之后,会在使用这个密钥为每一个ts媒体片段解密。
付费视频被人薅走?了解一下hls视频加密 插图9
这里有同学会想,密钥都是可以直接获取的,怎么样防盗? 这里的防盗并不是绝对的防盗,只是提高门槛,而且这个门槛可以设得高一点也可以低一点。 什么意思了? 实际应用中,我们会在密钥URI中加一个令牌,像是这样:
#EXT-X-KEY:METHOD=AES-128,URI="oceans.key?token=${令牌}"
这个令牌可以是一次性的或者时效性(一段时间后失效)。如果是一次性的,就可以防住大多数的视频下载软件,因为这些软件都是基于已有资源链接,再次请求实现视频下载的。按照这个原理,时效性的令牌是不能防住这些软件的,但是可以让m3u8索引文件的链接具有时效性,假如用户直接把这个链接分享出去给其他没有权限的人看,一段时间后就会失效,也起到防盗链的作用。 最后服务端只需要根据用户权限,给客户端返回加密并具有令牌m3u8索引文件,就可以实现视频的防盗。 下面这张图简单讲解了整体的加解密流程
付费视频被人薅走?了解一下hls视频加密 插图10
好!文章到这里就结束了,祝仍在坚持努力前行的各位,跑得比别人快,飞得比别人高。
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容