【在线M3U8音视频加密安全与技术防护】
>您好,本篇文章将由浅入深介绍M3U8视频格式及视频加密切片和市面上常见的加密防护托管方案。# 前言
近几年来知识付费的概念越来越受到欢迎,那么作为视频网校方而言,如何保证用户体验的前提下,防止视频资源被下载,低价贩卖传播,维护讲师和平台的利益,就成为了一个急需解决的问题。
# 常见的视频格式
| 后缀名| 介绍| 创造者
| -------- | -------- |-------- |
| .mp4 | 目前用途十分广泛的视频格式,例如网络电影、手机拍摄的视频、智能设备拍摄的视频、宣传片、MV等。.mp4具有在较小的文件属性下,拥有接近DVD画质的视频图像质量文件。|Moving Picture Experts Group-4(运动图像专家组) |
| .m4v | 一种应用于网络视频点播网站和移动手持设备的视频格式,是MP4格式的一种特殊类型,其后缀常为.MP4或.M4V,其视频编码采用H264,音频编码采用AAC。|苹果公司 |
| .mov | 一种音频、视频文件封装,用于存储常用数字媒体类型。|苹果公司 |
| .avi | 这个视频格式的文件,体积较同等时间、分辨率、音质码流等条件下偏大,其压缩方式众多;在二十年前,很多文件是以AVI格式来传播、拷贝的,目前,使用者不如之前多了。|微软公司 |
| .wmv | 在十几年前的流媒体mms时代,这种格式的视频文件和rm格式视频文件,备受欢迎,压缩比率高,画质损失也比较严重;使用的是SMPTE 421M标准,但是这种格式视频,这些年似乎不再流行。|微软公司 |
| .flv | 这种格式的文件,其特点是体积特别小,但是画质音质都损失严重。随着flash淡出历史舞台,这种格式的视频文件,也已不再流行。|Adobe |
| .mkv | 能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是Matroska定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。|CoreCodec Inc |
**我们最熟悉和常见的就是 MP4 格式了,但是目前90%的视频网站,却采用了 M3U8 格式**
# M3U8格式
> HLS(HTTP Live Streaming) 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。
M3U文件是记录了一个索引纯文本文件,可以指定一个或多个多媒体文件的位置,其文件扩展名是“M3U”或者“m3u”。打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。M3U文件的作用通常是创建指向在线流媒体的播放列表,创建的文件可以轻松访问流媒体。
**M3U8是Unicode版本的M3U,用UTF-8编码。**
m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。
当 m3u8 文件作为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。对于点播来说,客户端只需按顺序下载片段资源,依次进行播放即可。而对于直播来说,客户端需要定时重新请求该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。
当 m3u8 作为主播放列表(Master Playlist)时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Strean)。客户可以根据不同的网络状态选取合适码流的资源,并且最好根据用户喜好选择合适的资源内容。
**m3u8 文件要么是媒体播放列表,要么是主播放列表。但无论是哪种列表,其有效组成均由两部分构成:**
1. 以 #EXT 开头的为标签信息,作为对媒体资源的进一步描述;
2. 剩余的为资源信息,要么是片段资源(Media Playlist)路径,要么是 m3u8 资源(Master Playlist)路径;
**m3u8文件遵循的条件**
1. m3u8 文件必须以 utf-8 进行编码,不能使用 Byte Order Mark(BOM)字节序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
2. 每一行要么是一个 URI,要么是空行,要么就是以 # 开头的字符串。不能出现空白字符,除了显示声明的元素
3. 以 # 开头的字符串要么是注释,要么就是标签。标签以 #EXT 开头,大小写敏感。
**常用标签**
| 标签名| 功能介绍 |
| -------- | -------- |
| EXT-X-DISCONTINUITY| 该标签表明其前一个切片与下一个切片之间存在中断。EXT-X-DISCONTINUITY 的一个经典使用场景就是在视频流中插入广告,由于视频流与广告视频流不是同一份资源,因此在这两种流切换时使用 EXT-X-DISCONTINUITY 进行指明,客户端看到该标签后,就会处理这种切换中断问题,让体验更佳。|
| EXT-X-KEY| 媒体片段可以进行加密,而该标签可以指定解密方法。 |
| EXT-X-PLAYLIST-TYPE | 表明流媒体类型。全局生效。该标签为可选标签。 可选值如下:【VOD】 即 Video on Demand,表示该视频流为点播源,因此服务器不能更改该 m3u8 文件;【EVENT】 表示该视频流为直播源,因此服务器不能更改或删除该文件任意部分内容(但是可以在文件末尾添加新内容) |
| EXT-X-PROGRAM-DATE-TIME | 该标签使用一个绝对日期/时间表明第一个样本片段的取样时间。 |
| EXT-X-MEDIA-SEQUENCE | 表示播放列表第一个 URL 片段文件的序列号,每个媒体片段 URL 都拥有一个唯一的整型序列号。 每个媒体片段序列号按出现顺序依次加 1。媒体片段序列号与片段文件名无关。如果该标签未指定,则默认序列号从 0 开始。 |
| EXT-X-ENDLIST | 若出现EXT-X-ENDLIST标签,则表明M3U8文件不会再产生更多的切片,可以理解为该M3U8已停止更新,并且播放分片到这个标签后结束。M3U8不仅仅是可以作为直播,也可以作为点播存在,在M3U8文件中保存所有切片信息最后使用EXT-X-ENDLIST结尾,这个M3U8即为点播M3U8。EXT-X-ENDLIST标签可能会出现在播放列表文件的任何地方,但是不能出现两次或以上。 |
| EXT-X-STREAM-INF | EXT-X-STREAM-INF标签出现在M3U8时,主要是出现在多级M3U8文件中时,例如M3U8中包含子M3U8列表,或者主M3U8中包含多码率M3U8时;该标签后需要跟一些属性,下面就来逐一说明一下这些属性:【BANDWIDTH】:BANDWIDTH的值为最高码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的最大码率(必要参数)。【AVERAGE-BANDWIDTH】:AVERAGE-BANDWIDTH的值为平均码率值,当播放EXT-X-STREAM-INF下对应的M3U8时占用的平均码率(可选参数)。【CODECS】:CODECS的值用于声明EXT-X-STREAM-INF下面对应M3U8里面的音视频编码、视频编码的信息(可选参数)。【RESOLUTION】:M3U8中视频的宽高信息描述(可选参数)。【FRAME-RATE】:子M3U8中的视频帧率(可选参数)。 |
| ...省略 | 如果感兴趣,可以去购买《FFmpeg从入门到精通》书籍或者查阅ffmpeg官方文档(英文版) (http://) |
**客户端播放M3U8的一些标准**
1. 分片必须是动态改变的,序列不能相同,并且序列必须是增序的
2. 当M3U8没有出现EXT-X-ENDLIST标签时,无论这个M3U8列表中有多少个分片,播放分片都是从倒数第三片开始播放,如果不满3片则不应该播放。当然如果有些播放器做了特别定制了,则可以不遵照这个原则。
3. 以播放当前分片的duration时间刷新M3U8列表,然后做对应的加载动作。
4. 如果播放列表在刷新之后与之前的列表相同,那么在播放当前分片duration一半的时间内在刷新一次。
5. 前一片分片和后一片分片有不连续的时候,播放可能会出错,那么需要X-DISCONTINUTY标签来解决这个错误。
**注意事项**
1. 有两种请求 m3u8 播放列表的方法:一是通过 m3u8 的 URI 进行请求,则该文件必须以 .m3u8 或 .m3u 结尾;二是通过 HTTP 进行请求,则请求头 Content-Type 必须设置为 application/vnd.apple.mpegurl 或者 audio/mpegurl。
2. 空行和注释行在解析时都忽略。
3. 媒体播放列表(Media Playlist)的流资源总时长就是各切片资源的时长之和。
# TS文件格式
1. TS(Transport Stream)是一种音视频封装格式,全称MPEG2-TS。MPEG-TS主要应用于实时传送的节目,比如实时广播的电视节目。
2. TS文件(流)可以分为三层:TS层(Transport Stream)、PES层(Packet Elemental Stream)、ES层(Elementary Stream)。
3. ES层就是音视频数据,PES层是在音视频数据上加了时间戳等对数据帧的说明信息,TS层是在PES层上加入了数据流识别和传输的必要信息。TS文件(码流)由多个TS Packet组成的。
> TS文件(码流)的分层结构图
![](https://img-blog.csdnimg.cn/66a6f4bb01904f869e9b48299b126094.png#pic_center)
> PES包头示例,**47开头要记住**
![](https://img-blog.csdnimg.cn/c5f5529f75d14a18a41de5c850c34282.png#pic_center)
> ES ,PES, TS关系如图(请仔细看这个图,它准确的解释了解ES的原理)
![](https://img-blog.csdnimg.cn/7a3af8fb12404367871609900176ad2d.png#pic_center)
> TS包有效载荷图解
![](https://img-blog.csdnimg.cn/a7c31e42125e47d7a7a95722792488a8.png#pic_center)
**从图可以看出TS包的有效载荷分为PSI(节目特定信息) 和 PES。而PSI又分为PAT表和PMT表,各表所在TS包的PID参考上面的 “表2-3 PID表”。分别给出各句法说明**
>PAT表 (节目相关表)
![](https://img-blog.csdnimg.cn/0bb6cd1b120048ccb50c67e23f5bf45d.png#pic_center)
**PES理解**
1. PES = Packetized Elementary Stream
2. PES的payload是按照ES顺序的数据流
3. 一个PES就是一个音频或视频的sample
4. PES包头中含有timestamp信息
5. PES被分成多个TS包后,第一个TS包中含有PES包头,中间TS包大多数情况只含ES数据,极少数含调整字段和ES数据,极个别夹杂着不含ES数据而只有调整字段的TS包,只有最后一个TS包可能需要填充调整字段补齐188字节。
6. 音视频的PES的PID通过PMT表信息得到。
**解TS的方法**
1. 先找到PID为0x00 的TS包,找到里面的节目映射表(PMT)PID,因为可能有几个节目信息,所以可能有几个PMT_PID,以一个为例。
2. 接着查找该PMT_PID得TS包,通常就紧接着。在该PMT包中找音频和视频的PID。以视频为例。
3. 开始提取一帧ES数据:
4. 查找视频PID的TS包
5. 找PES包头,方法:TS包头第2个字节的高6位(有效载荷单元起始指示符)为1的TS包,跳过调整字段(自适应字段),找到PES包头,提取时间戳,再跳至ES数据,这就是一帧ES数据的开始部分
6. 查找有效载荷单元起始指示符为0的TS包。跳过TS包头,跳过自适应字段(有的话),提取后面的ES数据
7. 同c 接着查找。
8. 当碰到有效载荷单元起始指示符又变为1的视频TS包,就知道这是下一帧的开始了,将前面的所有ES数据组合成一帧数据。开始下一轮组帧。
**TS流生成流程**
1. 将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)。
2. 对ES(基本码流)进行打包形成PES。
3. 在PES包中加入时间戳信息(PTS/DTS)。
4. 将PES包内容分配到一系列固定长度的传输包(TS Packet)中。
5. 在传输包中加入定时信息(PCR)。
6. 在传输包中加入节目专用信息(PSI) 。
7. 连续输出传输包形成具有恒定比特率的MPEG-TS流。
**TS流解析流程**
1. 复用的MPEG-TS流中解析出TS包;
2. 从TS包中获取PAT及对应的PMT;
3. 从而获取特定节目的音视频PID;
4. 通过PID筛选出特定音视频相关的TS包,并解析出PES;
5. 从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;
6. 将ES交给解码器,获得压缩前的原始音视频数据。
# 目前最常见的盗版形式
| 方案 | 过程 |
| -------- | -------- |
| 下载 | 通过技术手段直接从网页端/客户端/H5页面下载视频 |
| 录屏 | 就是在观看视频的时候同步录制视频内容|
**明确了盗版路径,要做的就是对症下药。**
# 针对【录屏】的安全防护解决方案
****
**对小窗录屏/全屏录屏等行为起到强有力的震慑作用。**
1. 通过播放器实时监测,如果检测到视频处于录屏状态或小窗待录屏状态,视频会立即停止播放,以此来防止视频被盗取。
2. 将用户ID、电话号码或其他信息内容等以跑马灯的形式展现在视频上,实现设定文字在视频上不规则地跑动,可追溯录屏者身份
3. 在视频中添加用户专属的视频水印,从而让视频中融入企业的版权信息,防止盗录者盗取版权,保护公司的知识产权。
4. 视频播放到某个时间点,弹出问答播放器,只有答题正确,提交后才能继续观看,增加了录屏的难度,提高录屏成本,大大降低盗版视频的观看体验。
# 为什么要对视频切片?
**普通场景**
1. 相信大家都有这样的经历,一个视频太大,放到服务器上面,播放的时候,受服务器宽带和自己网络的影响访问会很慢。
2. 经常看视频的小伙伴肯定看到过下面的场景,网页上视频播放的时候,会有一个m3u8的请求,然后再去请求key,再一个ts一个ts的下载。
3. 这样有什么好处呢?就是当你视频五六百兆的大小,你可以通过工具将视频切片成一个个5兆大小的ts。
4. 然后生成m3u8文件,m3u8文件中包含每一个ts的名字和加密的key。
5. 这样播放的时候,会一个一个的去获取ts文件,因为ts文件的大小5兆左右,一般来说,普通服务器上就能很快的访问到。
**加密场景**
1. 比如说公司要求在视频播放快的基础上,还要保证视频不能被别人下载,也可以采用这个方式
2. 将mp4切片然后加密。然后对key的获取做限制,这样别人也就无法下载你的视频了。
# 部分影视站图床白嫖原理
1. 目前很多盗版影视站,ts流媒体视频文件,不存自己服务器,而是通过某些大平台的上传页面抓包,使用它们的图床
2. 有些没对图片接口做文件限制的,就被白嫖了
3. 这么做对于影视站来说,节约存储和带宽访问成本,对图床来说,增加了成本
4. 当然也有做文件限制的,检测是否为图片格式,通常是检测开头的几个字节。如【PNG】是 89 50 开头
5. 但是又出现了,对ts文件的开头拼接假图片(花屏,小尺寸图片),实现伪造真图片来欺骗接口的文件检测的效果实现上传成功的目的
**当然这种做法我是不赞同的,如果您是服务商,请检查上传图片的接口,防止被滥用。**
![](https://img-blog.csdnimg.cn/ef1636ed3c564357ac20a3d63df41932.png)
# 使用FFMPEG对MP4视频切片生成加密的M3U8文件
所需软件:
- openssl [点我下载](https://www.openssl.org/source/)(加密值生成)
- ffmpeg[点我下载](http://ffmpeg.org/download.html)(音视频切片)
如果出现了【不是内部或外部命令,也不是可运行的程序】请参考以下方案,操作步骤:
1. 您可以先把两个软件的所在目录添加到环境变量
2. 或者调用时使用绝对路径(E:\OVVO\ffmpeg.exe)
3. 或者放到同目录
导出随机16位字节到enc.key文件
> openssl rand 16 > enc.key
生成随机 iv 偏移 十六进制 字符串,记下来
> openssl rand -hex 16
![在这里插入图片描述](https://img-blog.csdnimg.cn/8a67a07c4476494faa0bc97aa9eb9f01.png)
> 新建一个文件 enc.keyinfo 内容格式如下:
```
Key URI # enc.key的路径,使用http形式
Path to key file # enc.key文件
IV # 上面生成的iv
```
> 举个例子:enc.keyinfo内容如下:
```
https://xxx/OVVO/enc.key
/OVVO/enc.key
59147068b6158bd311859d28f5ace301
```
> 视频分片,这里先用命令进行视频分片加密
```
ffmpeg -y \
-i "E:\OVVO\test.mp4" \
-hls_time "3" \
-hls_key_info_file "E:\OVVO\enc.keyinfo" \
-hls_playlist_type "vod" \
-hls_list_size "0" \
-hls_segment_filename "E:\OVVO\file%d.ts" \
"E:\OVVO\playlist.m3u8"
```
-i:要切片的原视频文件
-hls_time:指定生成 ts 视频切片的时间长度s秒
hls_key_info_file:enc.keyinfo文件的位置
hls_list_size: 索引播放列表的最大列数 默认5,0 为不限制
hls_segment_filename:生成ts和m3u8文件的路径及文件名
> 最终一行命令
```
ffmpeg -y -i "E:\OVVO\test.mp4" -hls_time "3" -hls_key_info_file "E:\OVVO\enc.keyinfo" -hls_playlist_type "vod" -hls_list_size "0" -hls_segment_filename "E:\OVVO\file%d.ts" "E:\OVVO\playlist.m3u8"
```
> 等待几秒,切片完成,如下图,多出了【.ts】和【.m3u8】文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/36c9ebf9461f436ba7381b3137162356.png)
> m3u8文件的内容
```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x59147068b6158bd311859d28f5ace301
#EXTINF:4.133333,
file0.ts
#EXTINF:3.700000,
file1.ts
#EXTINF:4.166667,
file2.ts
#EXTINF:1.833333,
file3.ts
#EXTINF:2.933333,
file4.ts
#EXT-X-ENDLIST
```
**为何我定义的每个碎片3秒,实际有4,3,4,1,2不固定?这是因为关键帧问题,也可以得到解决。**
# 如何本地播放看效果?
前置软件
1. 下载phpStudy(PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等。)
![在这里插入图片描述](https://img-blog.csdnimg.cn/6f4bad1ffda043698019386d6ca5039d.png)
2. 下载Play HLS M3u8(浏览器插件)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1c7cd350272a4af3b96205728cc51a44.png)
> 在【E:\OVVO】目录,将生成的【.m3u8】【.key】【*.ts】移动到【D:\phpStudy\PHPTutorial\WWW】
![在这里插入图片描述](https://img-blog.csdnimg.cn/a916160a43af408caa7022476d8f07f9.png)
然后在浏览器按下F12(开发者调试工具),打开本地网址,即可看到视频效果。
> http://localhost/playlist.m3u8
![在这里插入图片描述](https://img-blog.csdnimg.cn/84b95dcea78b46539c81f9962829cc52.png)
> 选择key文件看看响应值,奇怪?为什么是红色字符?因为那是不可见的(详细请查看ASCII码值表),如果直接复制会造成不一致的情况。
![在这里插入图片描述](https://img-blog.csdnimg.cn/91c10ee440cc4ae0ae48127cf31a1094.png)
> 那有什么办法能得到十六进制?可以下载010 Editor(专业文本/十六进制编辑器),打开【enc.key】文件,第一行就是了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/bf3b43ab0e8646afa11d042f283754be.png)
## 市面上的视频托管平台
>目前极少网站采用了这个新型格式,WebAssembly(简称wasm)是一个虚拟指令集体系架构(virtual ISA),整体架构包括核心的ISA定义、二进制编码、程序语义的定义与执行,以及面向不同的嵌入环境(如Web)的应用编程接口(WebAssembly API)。其初始目标是为C/C++等语言编写的程序经过编译,在确保安全和接近原生应用的运行速度更好地在Web平台上运行。
1. 新某某(Webassembly,分段key(如1-10碎片是一个key,11-20是另外一个key),使用Nodejs补环境就行)
2. 某某威,32位key
| 某某威版本 | 结论 |
| -------- | -------- |
| V10| M3U8和KEY,均在JS层处理,AES算法 |
| V11| Webassembly传递TS和某些值,返回解密后的TS,其中内部计算解密了key,当然也可以在内存的Buffer中Uint8Array截取得到,也可Nodejs调用,或魔改wasm,返回结果 |
| V1102| 同上,换了下盐 |
| V1103| 同上,换了下盐 |
| V12| Webassembly封装了ffmpeg库,输出的是YUV抛给Canvas渲染,实际只要反混淆下文件头就可以 |
如何逆向wasm?请翻阅漁滒的文章
> (https://www.52pojie.cn/thread-1556027-1-1.html)
> (https://www.52pojie.cn/thread-1581887-1-1.html)
> [某网站字幕加密的wasm分析](https://www.52pojie.cn/thread-1461335-1-1.html)
| 托管平台 | 结论 |
| -------- | -------- |
| 某某场景 | 21位KEY |
| 某家云 | 反混淆文件头,取前一段字节,运算替换下就行 |
| 某度云 | 对KEY进行了AES加密 |
| 阿某某 | JSVMP层生成随机数,并同时计算KEY,之后在PES层处理,不同于标准的AES-128-CBC而它是ECB算法 |
| 七某某 | 对m3u8和ts链接做时效限制,过期后就打不开了 |
| 慕某某 | 动态加密m3u8和key值 |
| 腾某某 | 16位KEY,并不是真正的,有JSVMP生成临时随机key和iv,再取返回值AES解密后才是 |
| 气某某 | 20位KEY,算法细节就是,针对部分第几位的值运算,如果请求二次后返回的是假的随机key |
| i某某 | xxtea算法,canvas有指纹同时运算才是 |
| 我要某某某 | 对m3u8和key动态加密 |
| 还有很多 | 不一一列举 |
**需要你掌握HTTP协议,JS逆向的知识,并断点分析【Hls.js】脚本,就可以得到如上结论。
正所谓,知己知彼百战百胜,我们看到了,核心关键在与key的保护**
# 针对【key】的安全防护解决方案
1. 通过以上的操作,我们暂时是实现了本地对视频切片,并生成【.m3u8】和【.key】和【.ts】
2. 现在的关键就在与【.key】的安全性,正常来说,是16位字节的,需要对它二次加密。
3. HLS加密技术:也可以称之为m3u8切片加密,这种是目前H5时代广泛使用的技术,该加密本身是很安全的,基于AES加密算法。但有个致命的问题:别人很容易拿到秘钥进行解密。这种方式最大的优点是:几乎主流浏览器都支持,包括微信、qq等,打开就能播放,兼容性很好。缺点也很明显
4. 因为算法是公开的,并且如果不保护好秘钥文件,ffmpeg等命令行、很多工具软件,均可拿到秘钥对视频基本还原,如果只是采用单纯的HLS加密技术,可以说:极其不安全。幸好,近几年国内很多厂商在标准HLS加密的基础上,对m3u8文件中的秘钥等做了防盗处理,这种二者结合,效果就好很多。
> 防盗链技术:这种严格来说,不属于视频加密,只是想办法防止视频被下载,只允许在线播放。但这种基本上来说属于防一般用户,很容易被绕过去。因为你只要让浏览器可以播放,别人就可以伪装自己是浏览器,拿到url,进行伪装浏览器的各种referer等信息,欺骗过防盗链系统,下载到视频。
| 防护种类 | 细节 |
|--|--|
| key身份鉴权 | 服务器验证Cookie是否购买 |
| key时效鉴权 | 若已购,则下发含【?t=1662901149&sign=2dc85bcdf05fad8d308000b0691b7c60】的链接,做时间限制,若10秒后访问就不给值了 |
| 次数限制 | 只允许访问一次 |
| IP白名单| 拒绝或只允许特定IP访问 |
| Referer | 基于HTTP Header跟踪来源,但可以伪造 |
| user-agent | 基于HTTP Header跟踪来源,但可以伪造 |
| Cookie | 基于用户信息跟踪来源 |
**电脑端**
> 视频文件内容采用私有算法真正逐帧加密:这种方式一般是基于不公开的算法,对视频文件、直播流、m3u8中的ts数据等,均可实现实时逐帧加密。但加密后的视频,需要专用特定播放器才可以播放。由于采用私有算法,因此其他播放器无法进行播放,增强了安全性。但也带来了一定不便利性,就是必须安装专用软件。不过这类技术就比较考验加密实力了,目前很多加密软件号称加密,但某宝等平台随便一搜,也有很多破解。因为,即使你用了专用播放器,但如果别人很容易逆向你的播放器,也就知道了加密算法,所以需要开发公司有多年深厚的研发实力才可以放心。
# 针对于试看业务逻辑的,防止白嫖方案
> 如果业务允许视频试看前2分钟,那么m3u8如下
```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x59147068b6158bd311859d28f5ace301
#EXTINF:4.133333,
000.ts
#EXTINF:3.700000,
001.ts
#EXTINF:4.166667,
002.ts
#EXTINF:1.833333,
003.ts
#EXTINF:2.933333,
004.ts
#EXT-X-ENDLIST
```
根据切片命名自增规则,之后的文件就是【005.ts】【006.ts】盲猜,循环取响应值,就能拼接出完整的m3u8了
> 如何解决?
**切片完,对所有.ts文件,已随机命名**
```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="key.txt"
#EXTINF:5.000000,
7bc1edc0a66379b6.ts
#EXTINF:5.000000,
68029aa7c69383c9.ts
#EXTINF:5.000000,
ad0a6b20b5225a93.ts
#EXTINF:5.000000,
458981605103f4d8.ts
#EXTINF:5.000000,
238684a014581aee.ts
#EXT-X-ENDLIST
```
# 分析时链接是blob?
> Blob和ArrayBuffer是什么鬼?
1. 最早是数据库直接用Blob来存储二进制数据对象,这样就不用关注存储数据的格式了。在web领域,Blob对象表示一个只读原始数据的类文件对象,虽然是二进制原始数据但是类似文件的对象,因此可以像操作文件对象一样操作Blob对象。
2. ArrayBuffer对象用来表示通用的、固定长度的原始二进制数据缓冲区。我们可以通过new ArrayBuffer(length)来获得一片连续的内存空间,它不能直接读写,但可根据需要将其传递到TypedArray视图或 DataView 对象来解释原始缓冲区。实际上视图只是给你提供了一个某种类型的读写接口,让你可以操作ArrayBuffer里的数据。TypedArray需指定一个数组类型来保证数组成员都是同一个数据类型,而DataView数组成员可以是不同的数据类型。
TypedArray视图的类型数组对象有以下几个:
> Int8Array:8位有符号整数,长度1个字节。
> Uint8Array:8位无符号整数,长度1个字节。
> Uint8ClampedArray:8位无符号整数,长度1个字节,溢出处理不同。
> Int16Array:16位有符号整数,长度2个字节。
> Uint16Array:16位无符号整数,长度2个字节。
> Int32Array:32位有符号整数,长度4个字节。
> Uint32Array:32位无符号整数,长度4个字节。
> Float32Array:32位浮点数,长度4个字节。
> Float64Array:64位浮点数,长度8个字节。
Blob与ArrayBuffer的区别是,除了原始字节以外它还提供了mime type作为元数据,Blob和ArrayBuffer之间可以进行转换。
> File对象其实继承自Blob对象,并提供了提供了name , lastModifiedDate, size ,type 等基础元数据。
## 视频加密防护发展方向
1. 浏览器端实现 WebAssembly 播放器(相对于JS层而言,难度提升了,调试也都是压栈出栈等指令的操作)
2. 谷歌的WideVine数字版权管理(DRM) 这么长,我看完了,我虽然很感兴趣,但是我只是看看,
我不会
但是看起来很厉害的样子
我以为你是给了个破解方案
结果是知识的普及
专业的 就是厉害 modesty88 发表于 2022-9-14 11:35
再怎么加密,大不了录屏解决问题
根据原帖,对于录屏可以通过插入(可见/不可见)用户专属水印的方式来追溯录屏者,同时对于在线课程来说也可以加入不定时答题的方式来增加录屏的成本。 感谢大哥的分享 格式多,好用 太强了哥,真的屌
太强了哥,真的屌 火钳留明,虽然自己也是白嫖比较多的,but 我觉得有需求就会有破解 学习了,感谢大哥的分享 tqltql 大佬太强了 必须收藏走一波 涨知识了,谢谢大佬科普