流媒体加密

本文只讨论应用于浏览器环境的流媒体协议的加密nginx

为何要加密视频

付费观看视频的模式是不少平台的核心业务,若是视频被录制并不是法传播,付费业务将受到严重威胁。所以对视频服务进行加密的技术变得尤其重要。git

本文所指的视频加密是为了让要保护的视频不能轻易被下载,即便下载到了也是加密后的内容,其它人解开加密后的内容须要付出很是大的代价。github

没法作到严格的让要保护的视频不被录制,缘由在于你须要在客户端播放出视频的原内容,解密的流程在客户端的话不法分子就能模拟整个流程,最保守也能用屏幕录制软件录制到视频的原内容(能够经过加水印的方法缓解下)。咱们的目标是让他获取原内容的代价更大。算法

常见视频加密技术

视频加密技术分为两种:浏览器

  1. 防盗链:经过验证的用户才能访问到没有加密的视频内容,这种方案存在视频很容易就被下载的风险,严格来讲这不属于加密。这种方式实际上是资源访问受权,它实现起来简单。
  2. 加密视频自己:经过对称加密算法加密视频内容自己,用户得到加密后的视频内容,经过验证的用户能够获取解密视频的密钥,在客户端解密后播放。这种方式实现起来流程复杂会带来更多的计算量。

通常结合这两种技术一块儿用,第1种技术很成熟也有不少教程就再也不复述,本文主要介绍第2种加密技术。bash

流媒体加密技术原理

看视频分为两种,看点播和看录播。
要看点播能够经过下载完整个视频后再看,或者经过流媒体边下边看。
看直播只能经过流媒体看最新的画面。服务器

加密整个视频的技术很简单,把视频当作一个文件采用加密文件的技术,这种技术太多就不介绍了。
加密流媒体的技术不多,也很难找到学习资料,本文主要介绍流媒体加密技术。网络

常见的应用与浏览器播放的流媒体传输协议有:ide

  • HLS:Apple 推出的基于 HTTP 协议的 MP4 分片传输协议,可用于点播和直播场景。每下载一个分片都须要发生一次 HTTP 请求,因此严格来讲 HLS 不能称为流媒体传输协议。
  • HTTP-FLV:基于 HTTP 长链接的 FLV 分块 tag 传输协议,可用于点播和直播场景。
  • RTMP:基于 TCP 的 FLV 分块 message 传输协议,用于 Flash 客户端。

流媒体加密原理

能够看出一个规律这些流媒体传输协议都必须把视频流拆分红连续的小块以后再被传送,只不过度块的大小和视频容器的格式不同而已。工具

流媒体加密技术的核心就在于对这每一小块视频分别使用对称加密算法,在服务端加密客户端解密,经过权限验证的用户才能拿到解密一小块视频的密钥。

为何不用 HTTPS 加密

可能有人会问为何不用 HTTPS 加密?缘由是 HTTPS 在网络传输层进行非对称加密,目的是为了防止中间人窃听劫持,任何人均可以和咱们的服务器创建 HTTPS 连接获取到原数据。而视频加密的目的不是为了防止有中间人窃听咱们的视频数据,而是要让视频数据自己被加密。

为何选择对称加密

现代成熟的加密技术分为对称加密算法和公钥密码算法(非对称加密)。之因此选择对称加密是由于流媒体要求很强的实时性,数据量又很大。公钥密码算法的计算都比较复杂,效率较低,适合对少许数据进行加密。对称加密效率相对较高,因此流媒体加密首选对称加密。例如在 SSH 登入的时候会先经过公钥密码算法传输一个密钥,再用这个密钥用做对称加密算法的密钥,在数据传输过程当中使用对称加密算法来提示数据传输效率。

HLS 加密

HLS 是目前最成熟的支持流媒体加密的能应用在浏览器里的流媒体传输协议,HLS 原生支持加密,下面来详细介绍它。

在介绍如何加密 HLS 先了解下 HLS 相比于其它流媒体传输协议的优缺点。
优势在于:

  • 创建在 HTTP 之上,使用简单,接入代价小。
  • 分片技术有利于 CDN 加速技术的实施。
  • 部分浏览器原生支持,支持点播和录播。

缺点在于:

  • 用做直播时延迟太大。
  • 移动端支持还好,PC端只有 Safari 原生支持。

HLS 加密原理

HLS 由两部分构成,一个是 .m3u8 文件,一个是 .ts 视频文件(TS 是视频文件格式的一种)。整个过程是,浏览器会首先去请求 .m3u8 的索引文件,而后解析 m3u8,找出对应的 .ts 文件连接,并开始下载。

hls
hls

m3u8 文件是一个文本文件,在开启 HLS 加密时,内容大体以下:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:26
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.do?k=1"
#EXTINF:9.901,
http://media.example.com/segment26.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.do?k=2"
#EXTINF:9.501,
http://media.example.com/segment28.ts复制代码

这个文件描述了每一个 TS 分片的 URL ,但这些分片都是加密后的内容,要还原出原内容须要从

#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.do?k=1"复制代码

中解析出获取解密密钥的URL https://priv.example.com/key.do 和对称加密算法 AES-128
获取到密钥后再在客户端解密出原内容。
能够看出启用 HLS 加密后会多出更多的事情:

  • 针对每一个 TS 须要去请求获取密钥。
  • 须要多提供一个给客户端获取密钥的鉴权服务。
  • 针对每一个 TS 须要去执行对称加密的解密计算。

这会带来更多的网络请求和计算量,可能会对延迟和性能形成必定的不良影响。

HLS 加密实战

支持 HLS 的客户端都原生支持加密,因此要开启 HLS 加密你只须要修改你的服务端:

  • 修改 HLS 视频服务,对 TS 加密,往 m3u8 中加入 EXT-X-KEY 字段。
  • 提供给客户端获取密钥的鉴权服务,即上面的 https://priv.example.com/key.do?k=1 所指向的服务。

目前大多数云服务都支持 HLS 加密服务,若是你想直接搭建 HLS 加密服务可使用 nginx-rtmp-module

HLS 兼容方案

目前 HLS 存在兼容性问题:

  • 针对桌面端低版本浏览器例如 IE,可使用 Flash 技术来播放 HLS ,详细使用见开源项目 flashls
  • 针对非Safari高版本浏览器例如 Chrome ,可使用 Media Source Extensions API 去实现播放 HLS,详细使用见开源项目 hls.js
  • 针对即不原生支持 HLS又不支持 Media Source Extensions 也不支持 Flash 的浏览器,常见于部分低版本移动端浏览器,我也找不到什么好办法。

flashls 和 hls.js 都支持 HLS 加密技术。

破解 HLS 加密

有加密就有破解,在明白 HLS 加密原理后,你想过如何去破解它吗?先定义下破解成功是指:获取到视频加密前的完整原文件。我想到的方法是:

  1. 先付费买一个可正常观看受保护视频的帐号。
  2. 用抓包工具抓下全部网络请求(能够筛选下限制到只保存 HLS 和 获取key 的请求,防止保存太多垃圾数据)。
  3. 第2步保存下来了加密后的 TS 分片和加密分片所须要的密钥。
  4. 写一个脚本以 m3u8 为索引一一解密出加密后的 TS 分片的原文件,再把 TS 拼接成完整的视频原文件。

彷佛破解的难度也不会很复杂。

总结

目前流媒体加密技术还不成熟,除了 HLS 协议提供了方便成熟的方案外,其它协议的加密技术还不成熟。

RTMP 协议提供了一个变种版 RTMPE 能够加密流媒体,原理和 HLS 加密相似,可是我还找不到合适的服务端去支持 RTMPE 协议。

阅读原文

相关文章
相关标签/搜索