[音视频] 下载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协议也很好的契合了这个行业。最后呼吁大家多多尊重版权,从正规渠道购买视频资源。创作不易。

  仅技术交流,请勿使用于非法用途。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线