[音视频] 下载M3U8加密视频文件
优采云 发布时间: 2022-06-10 10:40[音视频] 下载M3U8加密视频文件
0. 网页视频播放器的演进
随着浏览器的逐步迭代,网页播放视频方案也一直不断演进。从早期的MediaPlayer到Flash,再到video标签,我们可以更方便的在网页中播放视频。
1. HLS协议
在浏览器中,HLS协议的video标签是没有保存功能的(源码地址)。所以不能直接在浏览器中下载媒体文件,但是仅仅这一点是不够的,用户可以方便的拿到云存储上的视频地址,下载到本地即可以播放。所以HLS又提供了一套视频流加密的方案,这样云存储中存放的视频流也是加密的,由浏览器负责一边进行解密一边播放。
M3U8作为HLS协议的载体,也是我们后续分析的主要对象。详细的M3U8文件格式的介绍网上有很多,可以参照文档m3u8文件格式详解
下面列出一段未加密的样例传送门
没有加密的M3U8视频流
可以使用ffmpeg工具将视频保存到本地
ffmpeg -protocol_whitelist crypto,file,tcp,http,https,tls -i "https://node.imgio.in/demo/birds.m3u8" -c copy -copyts "birds.ts"
含有加密KEY的样例传送门
加密的M3U8视频流
因为样例中的解密KEY没有做鉴权,我们同样可以将视频保存到本地
ffmpeg -protocol_whitelist crypto,file,tcp,http,https,tls -i "https://cdn.theoplayer.com/video/big_buck_bunny_encrypted/stream-800/index.m3u8" -c copy -copyts "index.ts"
2. 加密策略
浏览器在解析M3U8协议文件时候,如果发现文件中指定了加密策略,就使用当前的网络环境访问该地址,获取对应的解密KEY。从云存储中读取到ts流之后,使用KEY和IV进行解密,然后在网页上播放。由于视频流一般是部署在OSS或者CDN,方便让用户下载,通常这类服务器是不会做鉴权策略的,于是对视频的保护就转变成了对解密KEY的保护。
2.1 refer检测
这是比较粗糙的方案,如果请求来源不是来自可信的域名,就直接返回错误。我们直接用ffmpeg工具操作M3U8时,访问解密KEY的URI是没有refer的,所以不能直接下载。
2.2 用户鉴权
很多网校通常会用这种方案进行加密,这种方式可以根据权限管理来决策哪些用户可以获取到解密KEY。推荐一种比较方便的方案,通过fiddler进行抓包,然后用python脚本解析对应的saz,将m3u8中的URI换成对应的KEY,然后使用ffmpeg将媒体文件保存到本地。
2.3 自定义KeyLoader
可以使用这个组件,支持自定义KeyLoader,通过URI从服务端请求回来一串字符串,经过定制的KeyLoader来解密之后,得到真正的解密KEY。这种需要我们的分析KeyLoader源码,百度云提供的加密视频方案就用了这个策略练手地址,对key的解密用到了AES-ecb,对解密KEY进行解密的密钥写死在js代码中。
2.4 自定义PlaylistLoader
除了可以自定义KeyLoader,这个组件也支持指定PlaylistLoader,这样M3U8文件也是动态解密出来的,增强了安全性练手地址。通过动态调试的方式可以拿到明文的M3U8和对应的解密KEY。由于网站的解密算法比较复杂,笔者没有尝试提取算法,感兴趣的大神可以分析下。
3. 实战下载百度的加密视频
这里使用Chrome浏览器进行演示,网页地址见2.3
3.1 抓取关键信息
打开开发者工具,定位到Network的tab页
点击播放token加密视频
触发了对m3u8文件的拉取
拉取视频流的解密KEY
通过关键字找到js文件中的KeyLoader
可以看到这里用到了AES-ecb解密,并且密钥也暴露在js文件中
下断点,重新加载视频,即可看到解密KEY
3.2 构造可以方便下载视频的M3U8
如何让ffmpeg工具方便的拿到这个key?我们搭建一个服务端接口:接收一个base64编码后的参数,解码成二进制流返回给客户端。(可能比较搓的方案,但是好在还很通用)
构造解密KEY的URI:
将复制下来的解密KEY做base64编码
替换M3U8文件中的URI部分
3.3 使用ffmpeg工具下载媒体文件
ffmpeg -protocol_whitelist crypto,file,tcp,http,https,tls -i "baidu.m3u8" -c copy -copyts "baidu.ts"
下载后的视频可以正常播放
4. 总结
在线教育成为了互联网的风口,HLS协议也很好的契合了这个行业。最后呼吁大家多多尊重版权,从正规渠道购买视频资源。创作不易。
仅技术交流,请勿使用于非法用途。