本文只讨论应用于浏览器环境的流媒体协议的加密nginx
付费观看视频的模式是不少平台的核心业务,若是视频被录制并不是法传播,付费业务将受到严重威胁。所以对视频服务进行加密的技术变得尤其重要。git
本文所指的视频加密是为了让要保护的视频不能轻易被下载,即便下载到了也是加密后的内容,其它人解开加密后的内容须要付出很是大的代价。github
没法作到严格的让要保护的视频不被录制,缘由在于你须要在客户端播放出视频的原内容,解密的流程在客户端的话不法分子就能模拟整个流程,最保守也能用屏幕录制软件录制到视频的原内容(能够经过加水印的方法缓解下)。咱们的目标是让他获取原内容的代价更大。算法
视频加密技术分为两种:浏览器
通常结合这两种技术一块儿用,第1种技术很成熟也有不少教程就再也不复述,本文主要介绍第2种加密技术。bash
看视频分为两种,看点播和看录播。
要看点播能够经过下载完整个视频后再看,或者经过流媒体边下边看。
看直播只能经过流媒体看最新的画面。服务器
加密整个视频的技术很简单,把视频当作一个文件采用加密文件的技术,这种技术太多就不介绍了。
加密流媒体的技术不多,也很难找到学习资料,本文主要介绍流媒体加密技术。网络
常见的应用与浏览器播放的流媒体传输协议有:ide
能够看出一个规律这些流媒体传输协议都必须把视频流拆分红连续的小块以后再被传送,只不过度块的大小和视频容器的格式不同而已。工具
流媒体加密技术的核心就在于对这每一小块视频分别使用对称加密算法,在服务端加密客户端解密,经过权限验证的用户才能拿到解密一小块视频的密钥。
可能有人会问为何不用 HTTPS 加密?缘由是 HTTPS 在网络传输层进行非对称加密,目的是为了防止中间人窃听劫持,任何人均可以和咱们的服务器创建 HTTPS 连接获取到原数据。而视频加密的目的不是为了防止有中间人窃听咱们的视频数据,而是要让视频数据自己被加密。
现代成熟的加密技术分为对称加密算法和公钥密码算法(非对称加密)。之因此选择对称加密是由于流媒体要求很强的实时性,数据量又很大。公钥密码算法的计算都比较复杂,效率较低,适合对少许数据进行加密。对称加密效率相对较高,因此流媒体加密首选对称加密。例如在 SSH 登入的时候会先经过公钥密码算法传输一个密钥,再用这个密钥用做对称加密算法的密钥,在数据传输过程当中使用对称加密算法来提示数据传输效率。
HLS 是目前最成熟的支持流媒体加密的能应用在浏览器里的流媒体传输协议,HLS 原生支持加密,下面来详细介绍它。
在介绍如何加密 HLS 先了解下 HLS 相比于其它流媒体传输协议的优缺点。
优势在于:
缺点在于:
HLS 由两部分构成,一个是 .m3u8 文件,一个是 .ts 视频文件(TS 是视频文件格式的一种)。整个过程是,浏览器会首先去请求 .m3u8 的索引文件,而后解析 m3u8,找出对应的 .ts 文件连接,并开始下载。
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 加密后会多出更多的事情:
这会带来更多的网络请求和计算量,可能会对延迟和性能形成必定的不良影响。
支持 HLS 的客户端都原生支持加密,因此要开启 HLS 加密你只须要修改你的服务端:
EXT-X-KEY
字段。https://priv.example.com/key.do?k=1
所指向的服务。目前大多数云服务都支持 HLS 加密服务,若是你想直接搭建 HLS 加密服务可使用 nginx-rtmp-module。
目前 HLS 存在兼容性问题:
flashls 和 hls.js 都支持 HLS 加密技术。
有加密就有破解,在明白 HLS 加密原理后,你想过如何去破解它吗?先定义下破解成功是指:获取到视频加密前的完整原文件。我想到的方法是:
彷佛破解的难度也不会很复杂。
目前流媒体加密技术还不成熟,除了 HLS 协议提供了方便成熟的方案外,其它协议的加密技术还不成熟。
RTMP 协议提供了一个变种版 RTMPE 能够加密流媒体,原理和 HLS 加密相似,可是我还找不到合适的服务端去支持 RTMPE 协议。