前段时间,朋友的一个公司网站视频点播接口被疯狂遍历请求,同时网上还出现了很多的针对这个网站视频的自动化视频下载工具。虽说是都是公开视频,但内容本身就是这个网站最大的价值,如果都通过工具下载视频观看,网站的DAU等数据肯定会受影响,广告的收益也会下降。为了帮助朋友解决这个困扰的难题,我调研了市面上常见的一些云点播视频的DRM解决方案。
首先说什么是「DRM」呢,根据某百科解释,DRM英文全称Digital Rights Management, 可以翻译为:数字版权管理,目前泛指所有与数字产品版权保护相关的所有技术手段。那么目前关于网站视频和云点播视频的版权保护的技术和方案都有哪些呢,我们可以看下表。
DRM方案类型 | 采用技术 | 方案案例 | 优劣 | 参考资料 |
---|---|---|---|---|
防盗链 | 一般包括 referer 防盗链和key防盗链。referer 防盗链就是服务端(或 cdn 节点)验证视频资源请求的referer 头来判断请求来源是否合法。基于 key 的防盗链将视频的播放控制参数以 QueryString 的形式拼接在视频 URL 中,CDN 节点将检查 URL 中的播放控制参数,并依据参数控制视频的播放。目前,Key 防盗链通过“过期时间参数”、“允许播放的 IP 数量参数”和“试看时间参数”,支持“防盗链有效时间控制”、“防盗链播放人数控制”和“视频播放时长控制”。 | 腾讯云防盗链方案、七牛视频防盗链方案等 | 能一定程度上防止盗链问题,不能解决下载后传播问题。 | https://cloud.tencent.com/document/product/266/11243、https://developer.qiniu.com/kodo/manual/1657/download-anti-leech |
视频加密 | 商业 DRM 微软 DRM SDK(playready) 、苹果fairplay 等 | Netflix | 依赖于微软 Microsoft Silverlight 播放插件和微软独有的编码方式。终端兼容性以及不同视频格式扩展性需要考虑(官方说明有 ios 和安卓插件支持),且 sdk 需要通过证书向微软申请,需要一定的时间周期。 | https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/design-tools/expression-studio-4/ff723877(v=expression.40) |
视频加密 | HLS 加密 | 腾讯云点播视频加密方案、各视频平台遵照 HLS 协议标准自己实现、阿里云 HLS 标准加密 | HLS 协议本身支持的加密方式。优点实现相对容易,使用标准的 AES128 对分割的每个 ts 文件进行加密,因此密钥的保护成了关键。(阿里教育每次密钥获取都是动态的) | https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-5.2、https://cloud.tencent.com/document/product/266/9638、https://www.52pojie.cn/thread-971265-1-1.html](https://www.52pojie.cn/thread-971265-1-1.html |
视频加密 | rtmpe 流媒体加密 | 没找到 | 需要搭建流媒体服务器软件,数据不能缓存,用户每次播放都要占用服务器带宽,不容易结合 CDN 加速等。服务器带宽压力大。 | |
视频加密 | mp4 文件加密(流加密、整个文件加密) | 没搜到商业方案 | 超大文件解密的性能是个问题 | |
视频加密 | 其他商业方案 | 保利威视( 36氪、好未来)、点量软件(咪咕、电视猫)、阿里云私有加密 | 阿里云私有加密必须使用阿里云播放器播放、36 氪测试网站的视频文件全部是 mp4 格式,访问 url 任意浏览器都可播放,经测试没发现保利威视官网宣传的36氪应用的加密方案实现。 | http://www.polyv.net/、http://www.dolit.cn/ |
建议大家可参考 key 防盗链的几种方式降低盗链风险。
key 防盗链几种方法:
防盗链有效时间控制
在视频 URL 中指定过期时间。如果请求的视频 URL 已过期,则视频无法播放。通过这种方式,可以为视频 URL 设置有效时间,防范他人将视频 URL 转移到其他站点后长期使用。
防盗链播放人数控制
在视频 URL 中指定链接最多能供多少人播放。不在同一内网的播放终端,它们的公网 IP 一般是不同的。通过限制一个 URL 允许最多能被多少公网 IP 播放,就能够限制同一个 URL 可以播放的人数,从而可以防范他人将视频 URL 转移到其他站点后,无限制地分发给任意多的人数观看。
视频允许播放时长控制
在视频 URL 中指定试看时长(如仅允许播放视频的前 5 分钟)。通过这种方式,可以实现对未付费用户的试看功能。
几种DRM方案对比
方案 | 优劣 |
---|---|
商业 DRM | 需要购买 license、集成 SDK 且方案兼容性各不相同 |
标准 HLS 加密 | 密钥易泄漏,较低程度上提升解密合成门槛 |
改良 HLS 加密 | 通过 js 保护还原解密的明文密钥,比标准的略微提升一些门槛 |
基于商业加密方案 | 需要购买并集成商业独有的播放器(阿里云私有加密)、不使用标准的 AES128 算法 |
加密方案可行性和成本,可基于 HLS 进行加密方案的建设和扩展。HLS 方案采用标准的 AES 128 算法,因此密钥保护是最为关键的。
HLS 加密:
标准的 HLS 加密
参考了阿里、腾讯云等厂商的标准 HLS 方案,大致思路基本相同。
整体架构分为 KMS、转码服务后台、鉴权与密钥派发服务、cdn、app 客户端和视频播放器 sdk
根据上图,总结加密流程:
1.app 后台发起视频加密服务,转码服务向 KMS 获取数据密钥(DK 和 EDK)和解密密钥获取 URL
名词解释:DK(由 KMS 系统生成的,用于对称加解密的密钥。实际用户加解密 ts 文件的)
EDK(任意用户都可以获取的,用来换 DK 的,DK 和 EDK 有对应关系,密钥服务可缓存这种关系,免去每次向 KMS 请求获取)
2.转码服务进行视频内容切片并使用密钥 DK 进行加密,在 M3U8 文件的 EXT-X-KEY 标签中会写入解密密钥的获取 URL 等信息。
3.发布加密后的 M3U8 视频播放地址
解密流程:
1.用户通过 app 登录,服务端会返回用户身份的 token
2.用户播放视频,访问 M3U8 下载对应的 ts 文件,通过 EXT-X-KEY 头中读取 URL,会向密钥服务请求解密密钥
https://getkey.example.com?fileId=123456&keySource=VodBuildInKMS&edk=abcdef&token=ABC123
如上例子所示,请求地址中保函 edk 和用户的 token,还有签名信息等,密钥服务会校验用户身份、签名等,通过后会根据资源 id 和 edk 返回解密 dk
3.播放器获得 DK,对 ts 文件进行解密,可以开始播放。
以上就是标准的 HLS 加解密的一个大致流程,这种方案对播放器没有限制,支持主流的大多数播放器。
问题:
但是一个最大的问题就是(阿里云和腾讯云在官方文档都有说明),需要用户自己保护好 DK 密钥。因此 DK 传输到客户端之后的安全保障机制尤为关键。
按照标准的 HLS 加密方法,密钥 DK 一定会返回给客户端,因此通过在客户端进行劫持和抓包就能获取解密的 DK,故而视频 ts 文件就能轻松解密。
我爱破解、知乎上都有很多解密的拼接转码成完整视频 mp4 的教程和文章。
https://www.52pojie.cn/thread-971265-1-1.html
还有很多写好的自动化工具,提供 m3u8 的 URL 就能自动进行解密和 ts 文件合成
https://www.52pojie.cn/thread-785996-1-1.html
阿里学院的采用私有加密的方案
密钥长度是 20 个字节,确认是没有使用 HLS 的标准加密方法。
腾讯课堂采用标准的 HLS 加密方案(查看腾讯云的文档也确实只支持标准的 HLS 加密)
通过抓取与服务端交换获取的 DK 文件,即可通过标准的 aes-128 算法对 ts 加密文件进行解密。
最后总结调研了几家视频网站的加密方案,给大家一些参考:
调研市场竞品视频加密情况汇总 | ||
---|---|---|
视频点播网站 | 爱奇艺 | 缓存采用 HLS,文件格式 ts,可以获取地址直接播放,没有加密(包括 vip 视频) |
优酷 | 缓存采用 HLS,文件格式 ts,可以获取地址直接播放,没有加密视频文件 | |
短视频直播类 | 快手 | 回播视频采用 HLS,文件格式 ts,可以获取地址直接播放(ts 文件比较大,可以通过头 range 控制下载的 ts 文件大小),没有加密视频文件 |
抖音 | 视频是 mp4 格式,访问链接直接下载播放,没有对视频文件加密 | |
教育课程类 | 阿里学院 | 使用阿里云的私有加密方法(也是基于 HLS,替换了算法,必须基于阿里云播放器) |
腾讯课堂 | 采用 HLS 标准加密方法,可通过抓包获取密钥解密 ts 文件 | |
学而思网校 | 采用 HLS 标准加密方法,可通过抓包获取密钥解密 ts 文件 |