查看原文
其他

防止源视频被盗用?这样改进HLS帮你搞定

杨健 京东科技技术说 2022-06-25

HLS

设计人:杨健

京东科技移动平台团队原创,转载请获得授权


一、背景

公司以提升潜在用户规模、提升用户价值、提升收入规模、契合企业战略定位为目标,通过视频课程(财商课)的形式帮助用户建立理财意识和用户对平台的基础信任感,在通过实践课中技术型指导内容解决用户不知道如何实操投资的情况,建立用户的交易信任、提升用户对平台专业度的认可,同时社群全链路植入交易转化手段,带动用户金融交易转化,在链路中视频课程是个重要的节点,那么对视频的保护就尤为重要。

二、前言

目前网络上最常见的视频加密应用,可能就是教育培训机构的视频文件加密了,因为这样的机构如果不做加密不做版权方面的保护,最容易被人盗用,这就是为什么有些机构的视频,在某某平台可以花几块钱买到,因此,市面上出现了很多种视屏加密的方案。
 
防盗链技术:这种严格来说,不属于视频加密,只是想办法防止视频被下载,只允许在线播放,但这种基本上来说属于防一般用户,很容易被绕过去,因为你只要让浏览器可以播放,别人就可以伪装自己是浏览器拿到url,进行伪装浏览器的各种referer等信息,欺骗过防盗链系统,下载到视频。

HLS加密技术:也可以称之为m3u8切片加密,这种是目前H5时代广泛使用的技术,该加密本身是很安全的,基于AES加密算法,但有个致命的问题:别人很容易拿到秘钥进行解密,因为算法是公开的,并且如果不保护好秘钥文件,ffmpeg等命令行 很多工具软件,均可拿到秘钥对视频解密还原,如果只是采用单纯的HLS加密技术,可以说:极其不安全。

视频文件内容采用私有算法真正逐帧加密:这种方式一般是基于不公开的算法,对视频文件、直播流、m3u8中的ts数据等,均可实现实时逐帧加密,但加密后的视频需要专用特定播放器才可以播放,由于采用私有算法,因此其他播放器无法进行播放,增强了安全性,但也带来了一定不便利性,就是必须安装专用软件,但是即使你用了专用播放器,如果别人逆向了你的播放器,也就知道了加密算法。

所以就有了更安全的加密方式-------数字版权保护DRM,DRM基本是三足鼎立的情况,微软的PlayReady,谷歌的Widevine,苹果的FairPlay,不同操作系统、浏览器和移动平台需要不同的方案,所以,看起来我们没办法用一套方案把所有的加密都做完。

三、标准DRM

DRM是利用技术手段以一定的安全算法实现对数字内容的保护,防止未经授权的内容传播和被修改,例如视频、音频、图片、安全文档等数字内容。
 
简单的说DRM的工作原理是:将音频、视频等文件进行加密编码处理,再建立一个证书授权服务中心,当用户使用这些加密文件时,应用会根据其包含在头文件中的有关属性自动链接到相应的站点(证书授权服务中心)获取相应的证书,只有通过授权中心的验证并获得授权,才能使用这些音、视频等文件,从而严密有效的保护了这些数字多媒体产品的版权和使用权限。
DRM运行流程(上图)
 
DRM有PlayReady,Widevine,FairPlay 的加密方案,理论上可以通过多重DRM的方式实现加密, 但是满足不了定制化的需求,所以我们基于HLS实现了DRM加密。
 
四、HLS加密

在实际使用中基于HLS实现的标准DRM分为两部分。第一部分是对原始的文件进行加密,首先将视频流分片,然后对每一个片元进行加密,一般来说,采用AES-128完成加密,在完成加密的同时,还可添加其他安全信息, 加密过程是第一部分的核心步骤。

要了解此步骤的加密方案,首先要了解标准HLS。HLS是苹果公司提出的基于HTTP的流媒体网络传输协议,它的基本原理是服务端把文件或媒体流按照不同的码率切分成一个个小片段(ts切片)进行传输,客户端通过索引文件(M3u8)获取到ts切片然后播放HLS流。

苹果官方文档的配图
 
上图是苹果官方文档的配图,需要关注的是Stream segmenter (流切片器)。流切片器(通常是一个软件或者一个SDK,例如ffmpeg)会将Media encoder编码后的数据数据切割成一组相等时间间隔的小媒体文件,虽然每一个片段都是一个单独的文件,但是他们的来源是一个连续的流,切完照样可以无缝重构回去。

切片器在切片同时会创建一个索引文件(Index file),索引文件会包含这些切片文件的引用。每当一个切片文件生成后,索引文件都会进行更新,索引用于追踪切片文件的有效性和定位切片文件的位置。

当需要对流文件加密时,通常都会对每一个片源进行加密,这种加密方案是目前H5广泛使用的技术,该加密本身是很安全的,基于AES加密算法,但有个致命的问题,别人很容易拿到秘钥进行解密,因为算法是公开的,所以假如有人拿到密钥了,很容易解密视频。


上图就是一个m3u8文件的例子,通过解析可以获取到文件中的字段,其中的.ts文件就是切片,咱们需要关注的是EXT-X-KEY这个字段,METHOD是切片的加密方式,URI可以获取用于解密切片的密钥(key),IV(加解密时需要提供一个16字节的初始化向量)通过URI可以获取到key, 此时就可以拿这个key通过相应的算法解密切片了,然后借助 Media Source Extensions将 buffer内容进行合流,组成一个可播的媒体资源文件。

五、KEY加密

加密的视频文件播放时,需要先获取密钥,解密视频文件,然后播放视频。所有这些过程都在客户端进行,对于具有一定开发能力的用户,还是能够获取密钥文件和加密视频,然后还原出原视频,所以第二部分是保护解密密钥。

通用的保护密钥的方法有以下几种:

  • 保护密钥URL:这依赖于隐藏解密密钥的URL,它不能提供高级别的安全性,因为URL可能会泄漏或被截获。

  • 使用认证cookie:用户可以通过密钥请求发送认证cookies,这需要密钥服务检查请求密钥的用户,如果不允许用户访问流,则不会返回密钥,因此只有具有适当身份验证的用户才能接收解密密钥。

  • 保护密钥:这需要密钥服务返回密钥时通过相应的算法对密钥进行加密,然后客户端进行解密。


但是上述三种方案都有缺陷,所以我们结合了上述三种方案并加以改进,采用下面的措施进一步保护源视频防止下载: 

1、通过权限验证保护密钥URI防止盗链以及增加用户获得密钥文件的难度。


上图把绿色框去掉就是一个标准的HLS播放流程,这样不经过校验KEY很容易就会被获取到,所以在中间加了一层校验,获取m3u8文件之前申请了一个临时的Token,在下载对应KEY时会进行一次校验,一般Token都会有一个有效时间,当Token过期就获取不到KEY了。
 
2、将索引文件和密钥文件二次加密,修改客户端播放器,使其先解密索引文件和密钥文件,再播放加密视频。


上图在校验Token的基础上加了一层密钥加密(非对称加密),在解析出URI后生成一对密钥(公钥、私钥),通过URI下载key时把公钥传给密钥服务方,服务方用公钥加密KEY并返回给播放器,播放器用生成的私钥通过对应的算法解密出KEY, 然后进行解密播放。这样即使有人获取到了公钥,也无法解密出密钥,大大增加了获取密钥的难度。

以上就是HLS实现的 DRM生产及播放流程,从技术角度上,这套加密规范可以很好的把加密内容安全地传输到客户端,但是有一个情况需要注意,因为苹果不支持MSE媒体源扩展,要想对苹果的HLS做自定义加密需要用到FairPlay,所以我们需要两套加密方案才能实现全平台的加密。

关于视频保护的课题还有很多, 动态加密、动态水印、h5防录屏等,未完待续。


好文推荐:
>  京东金融App崩溃治理实践
>  活动可视化怎么做?看京东乐高架构设计
>  京东科技Redis跨数据中心双向同步优化实践
>  轻量级工作流引擎的设计与实现

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存