我猜很多看这篇文章的的都是视频类开发者,可以加我交流一下噢
对m3u8的一些见解
m3u8作为目前在线视频的主流,被各大小厂商用到,但是大家有没有发现,m3u8自带的aes-128加密的存在好像可有可无,因为key的url链接没有做防御,只要对链接的抓包即可下载或者盗播,完全没有安全性.
简单防护
在m3u8文件中有很多#开头的解析符号,都是在解析m3u8的时候进行设定常量或者加密的key,iv,或者时长.ffmpeg中有一个小细节,他是通过判断后缀
来切换解析器的,例如后缀是.ts
,那就跳到hls解析
,如果是mp3
的,可能就跳到aac
那儿
改文件后缀
简单的修改ts文件后缀,改成其他,然后在ffmpeg源码中添加这个后缀跳转的解析器,这样普通人就无法播放你的连接了
key文件限制
key的url中,很多人都是没有任何判断,任何人都能访问的,然而key文件的存在实际上是需要对访问它的来源进行分析的
,例如在header上加入一段token,或者在key的访问的时候鉴权,都是简单的访问限制,至少让不会普通人能通过其他渠道看到你的视频.
m3u8鉴权
目前是个对象存储都会自带这个功能的, 不过别人可以逆向分析之后直接缓存
,设定过期时间可以恶心别人,不过算是杀敌一千自损三百.
主流解析引擎-ffmpeg
ffmpeg作为99%框架运用的内核,他集成了各种视频编码解析,m3u8只是其中之一,然而作为CV工程师,大家都是直接用github上编译好的ffmpeg,例如ijk,exo
这些集成好的播放框架,这里有一个可以做安全的点->魔改加密
魔改加密
因为ffmpeg的默认加密只有aes-128,那只要你自己在其核心代码中加入其他标准加密,甚至加入一些自己的加密算法
,这样作为盗播的破解者就只能永远跟着你的脚步进行破解,安卓层里面,ffmpeg的核心代码都在so层,只能用ida慢慢分析.
难度等级对于会c的人来说不难,也就是集成一个加密.
这样做之后被人无法在服务端对你的视频进行解密,如果每个ts都解密一遍会有很大的带宽需求.
但是这种还是可解的.具体自己想8
最近看到一个安全性目前看到最好的
需要满足一下条件
- 每个链接只能访问一次
- 前端开启边看边缓存
- 链接绑定帐号
- 帐号风控系统
ts鉴权
ts的加载是实时的,在读到那个ts的时候才会加载,如果在ts加载的时候进行鉴权
,那也是一个防护的手段
难度等级在exo和ijk的实现不一样
,各位可以自己斟酌一番.
这里有一个很多大厂都有犯的bug,但是我想大家在评论区发一下大家的想法~先不说了
#EXT-X-MAP
切片ts公用头部
主流框架
exo
在java层进行setSource,再调用ffmpeg进行播放,ffmpeg主要进行播放
ijk
调用ffmpeg进行播放,ffmpeg负责大部分工作.
区别
显而易见,exo比较容易分析,因为他大部分代码都可以被直观逆向分析,而ijk为了支持多平台所以更多的代码在底层的ffmpeg.
有机会再说一下其他…看情况8