M3U8工作原理以及key解密视频流详解

文章目录

  • 前言
  • 一、M3U8是什么?
  • 二、HLS—M3U8的工作原理
    • 1.分段视频流
    • 2.生成播放列表
    • 3.客户端请求和解析
    • 4.片段下载和播放
  • 三、.m3u8文件内部是什么样的?
  • 四、简单介绍下AES-128算法
  • 五、拿到KEY后如何去解密?
    • 1.手动解密.ts文件
    • 2.前人栽树,后人乘凉
    • 3.为什么有的key拿不到?有的能拿到但解密失败?

前言

之前随手写了一篇文章 某网课平台m3u8 key解密算法分析以及python实现
没想到有那么多的朋友关注,在这里感谢大家的支持。

最近收到不少私信都是关于m3u8解密的问题,沟通的时候发现有很多人对基本概念不是很解。这篇文章将带领大家详细了解下m3u8相关的一些基础知识,希望对大家有所帮助。

废话不多说,下面开始进入正题。


一、M3U8是什么?

有人说m3u8是一种视频格式,m3u8解密就是去解密m3u8。这种说法是错误的。

m3u8文件是指UTF-8编码格式的M3U文件,它实际上是一个包含多个URL的文本文件,每个URL指向一个音频或视频片段。这些片段可以是分段的,使得流媒体可以按需传输,从而实现自适应码率。m3u8文件通常用于流媒体传输,是HTTP Live Streaming(HLS)技术的一部分(HTTP LiveStreaming)是一种由苹果公司开发的流媒体传输协议,用于在互联网上实时传输音频和视频内容。它的主要特点是将整个视频流切分成短小的ts片段,并使用m3u8播放列表文件指示这些片段的顺序和位置。

不难看出,m3u8其实就是一个播放列表索引文件。

二、HLS—M3U8的工作原理

1.分段视频流

首先,视频流会被分成很多个小的.ts格式的片段。

2.生成播放列表

服务器或生成一个.m3u8文件,其中包含了所有的.ts片段的URL。

3.客户端请求和解析

客户端(浏览器)获取到.m3u8文件后,会解析其中的信息,包括每个.ts片段的持续时间、序列号、以及对应的URL。

4.片段下载和播放

客户端根据解析得到的信息,开始下载第一个.ts片段。通常,客户端会同时下载几个片段来提高播放的流畅性和缓冲性能。
当第一个.ts片段下载完毕后,客户端会开始播放这个片段。同时,客户端会继续下载后续的.ts片段,以确保连续的播放体验。

三、.m3u8文件内部是什么样的?

当我们使用文本编辑器打开.m3u8文件后,里面可能是这样的:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.000,
http://example.com/video/segment0.ts
#EXTINF:10.000,
http://example.com/video/segment1.ts
#EXTINF:10.000,
http://example.com/video/segment2.ts
#EXTINF:10.000,
http://example.com/video/segment999.ts
#EXT-X-ENDLIST

也可能是这样的:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/keyfile",IV=0x1234567890abcdef1234567890abcdef
#EXTINF:10.000,
http://example.com/video/segment0.ts
#EXTINF:10.000,
http://example.com/video/segment1.ts
#EXTINF:10.000,
http://example.com/video/segment2.ts
#EXTINF:10.000,
http://example.com/video/segment999.ts
#EXT-X-ENDLIST

很明显后者多了一行

#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/enc.key",IV=0x1234567890abcdef1234567890abcdef

其实,它就表示这个.m3u8文件里的视频流片段被加密了。大概意思是:

使用AES-128算法加密,KEY被存放在https://example.com/enc.key里 ,IV是0x7d5f0881be55ce4a3f2b8d811de877db

四、简单介绍下AES-128算法

AES-128是一种加密算法,存在很多种模式如:ECB、CBC、CTR等。
在加密视频流里常见的就是CBC模式,这个模式的特征是使用KEY(密钥)和IV(初始化向量)去加密数据。通常KEY和IV的长度都是128比特(bit)也就是16字节(byte)。

例如:我们使用AES-128-CBC算法加密 hello csdn 这句话。首先我们需要自行设置一组key和iv。
假设:key和iv分别为

5931636472715a5a35446e5441614f50
1234567890abcdef1234567890abcdef

使用外部工具对其加密后的结果如图: 
 在这里插入图片描述
 
可以看到加密后的数据为

79E2EF0572DF66270837A6F09C74B432

有加密就会有解密

我们也可以使用key和iv对加密后的数据进行解密
 
在这里插入图片描述
 
解密结果:

hello csdn

与我们加密前的完全一致。

由此可见,无论是加密还是解密,数据keyiv 这三个要素缺一不可。

五、拿到KEY后如何去解密?

首先我们要搞清楚解密对象是谁?

看懂了上文HLS—M3U8的工作原理,就不用我解释,接着往下看即可。

如果仍然认为所谓的m3u8解密是对m3u8文件去解密,请回到文章开头重新阅读。

1.手动解密.ts文件

样本地址:aHR0cHM6Ly93d3cuaHVvaHV0di5uZXQv

播放任意视频,F12打开开发者工具后刷新网页,抓到m3u8请求包。
在这里插入图片描述

我们可以尝试下提取其中任意一条.ts的URL下载到本地进行播放。
在这里插入图片描述

无法正常播放并提示文件类型不受支持,或文件已损坏,其实这就是典型的被加密。我们只需要找到key和iv即可对其解密。

其实在我们抓包m3u8请求的时候,key和iv就已经出现了。

#EXT-X-KEY:METHOD=AES-128,URI="enc.key",IV=0x00000000000000000000000000000000

这里已经明确地告诉了我们,iv是

0x00000000000000000000000000000000

key存放在当前目录下enc.key文件里。

在这里插入图片描述
而这个请求,实际上已经返回了key

Y1cdrqZZ5DnTAaOP

可能会有人疑惑,这个key咋那么短呢?

实际上,这是十六进制key经过ASCII编码后得到的字符串格式的key。这种情况需要特别注意,以后会很常见。特别是key被加密时分析js文件的时候,十六进制与字符串、字节数组之间的转换知识尤为重要,后面有机会再说吧。

我们可以将enc.key文件下载下来使用文本编辑器打开。

在这里插入图片描述
就得到了十六进制key

5931636472715A5A35446E5441614F50

现在我们可以对.ts文件进行解密了,下面是解密代码:

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpaddef decrypt(data,key,iv):cipher = AES.new(key, AES.MODE_CBC, iv)dec_data = unpad(cipher.decrypt(data), AES.block_size)return dec_dataif __name__ == '__main__':key = bytes.fromhex('5931636472715A5A35446E5441614F50')iv = bytes.fromhex('00000000000000000000000000000000')# 读取本地加密ts文件with open('1.ts','rb') as f:enc_ts = f.read()# 解密tsdec_ts = decrypt(enc_ts,key,iv)# 将解密后的ts保存with open('dec.ts','wb') as ff:ff.write(dec_ts)

代码执行完毕后打开解密后的.ts文件,已经可以正常播放。
在这里插入图片描述

至此,视频流的其中一个片段就解密成功了。

后续可以增加代码,实现从m3u8文件读取所有的ts,进行批量解密。然后合并成一个大的ts文件,最后再转为.mp4格式。

这里就不写详细代码了,因为有更好的解决方案,请继续看下文。

2.前人栽树,后人乘凉

手动解密ts是为了让大家更好的了解加密视频流的解密逻辑。在实际应用中,大可不必这么麻烦。

我们可以使用一些成熟的m3u8下载工具进行解密下载。

如:逍遥一仙M3U8下载器、N_m3u8DL下载器等,这些下载器的功能都很完善,并且是免费使用的。

在这里插入图片描述

在此向这些无私奉献的前辈们致敬!

3.为什么有的key拿不到?有的能拿到但解密失败?

这种情况是非常常见的,原因可能有以下几点:

①.key被加密
②.key的获取方式被加密
③.m3u8、key具有使用次数限制
······

本文重点是带大家了解m3u8的工作原理以及key是怎样解密视频流的。所以这些问题就不在此叙述了,有兴趣的朋友可以翻看我上一篇文章。后续有时间也会发一些比较常见的案例以及解决方法,暂时就写到这了。


如果您觉得这篇文章对您有所帮助,那将会是我莫大的荣幸。
如有不足请予以指正,在此感谢大家的支持和关注,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习速通系列:Bert模型vs大型语言模型(LLM)

什么情况用Bert模型,什么情况用LLaMA、ChatGLM类大模型? 选择使用Bert模型、LLaMA模型或ChatGLM模型等大型语言模型(LLM)时,应根据具体的应用场景、任务需求、资源限制和预期目标来决定。以下是更详细的指导原则: Be…

WPF 利用视觉树获取指定名称对象、指定类型对象、以及判断是否有验证错误

1.利用视觉树获取指定名称对象 /// <summary> /// Finds a Child of a given item in the visual tree. /// </summary> /// <param name"parent">A direct parent of the queried item.</param> /// <typeparam name"T">T…

spring security 如何解决跨域的

一、什么是 CORS CORS(Cross-Origin Resource Sharing) 是由 W3C制定的一种跨域资源共享技术标准&#xff0c;其目就是为了解决前端的跨域请求。在JavaEE 开发中&#xff0c;最常见的前端跨域请求解决方案是早期的JSONP&#xff0c;但是JSONP 只支持 GET 请求&#xff0c;这是一…

深度学习从入门到精通——基于unet++算法实现细胞分割

模型定义 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channe…

FPGA速度优化

速度优化 文章目录 速度优化前言一、时序优化1.1 减少关键路径上的时序1.1.1 关键路径重组1.1.2 解决扇出问题1.1.3 路径上插入寄存器1.1.4 寄存器平衡1.1.5 并行结构1.1.6 消除代码优先级 总结 前言 速度优化&#xff0c;主要就是设计时序进行优化 吞吐量&#xff1a;每个时…

web渗透:RCE漏洞

RCE漏洞&#xff0c;即远程代码执行漏洞&#xff0c;是一种安全缺陷&#xff0c;它允许攻击者通过网络在目标系统上执行任意代码。一旦成功利用&#xff0c;攻击者可以完全控制受影响的系统&#xff0c;包括读取敏感数据、安装恶意软件、修改系统配置等。RCE漏洞通常发生在应用…

数据结构---双向链表---循环链表---栈

目录 一、双向链表 1.1.创建双向链表 1.2.头插法 1.3.尾插法 1.4.查询节点 1.5.修改节点 1.6.删除节点 1.7.打印节点 1.8.销毁链表 二、循环链表 2.1.单循环链表 2.2.双循环链表 三、栈 3.1.顺序栈 1.创建栈 2.判断栈是否满 3.判断栈是否为空 4.进栈 5.出栈…

SAP 生产订单工序删除状态撤回简介

SAP 生产订单工序删除状态撤回简介 一、业务场景二、处理办法三、系统控制一、业务场景 生产订单正常没有按工序分配物料,系统会自动会把物料分配到第一道工序中 生产订单中的0010工序中对应的组件的栏位被标识,表示有物料分配到了0010的工序中,正常情况下0010的工序被分配…

【微服务】springboot 自定义注解+反射+aop实现动态修改请求参数

目录 一、前言 二、动态修改接口请求参数的场景 2.1 动态修改请求参场景汇总 2.1.1 数据格式标准化 2.1.2 安全需要 2.1.3 参数校验与默认值设定 2.1.4 数据隐私保护 2.1.5 适配不同客户端 2.1.6 统计与监控 2.1.7 高级功能特性 三、springboot 使用过滤器和拦截器动…

【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十五)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

Oracle rac模式下undo表空间爆满的解决

文章目录 前言一、确认对应实例的undo表空间二、确认对应实例undo的文件位置三、确认回滚段使用情况四、检查undo segment状态五、创建新的undo表空间并进行切换六、等待原undo表空间segment状态变更为offline七、删除原undo表空间以及数据文件 前言 一、确认对应实例的undo表空…

【云原生】Helm来管理Kubernetes集群的详细使用方法与综合应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Seata环境搭建

1、Seata下载&#xff1a; 1.下载地址 2.下载的版本 2、Seata参数配置参考&#xff1a; 各种seata参数官网参考 3、Seata安装部署&#xff1a; 3.1.Seata新手部署指南: 3.2.在mysql8.0数据库里面建库建表 a.建数据库&#xff1a; create database seata; use seata;b.建…

PVN3D(一)代码框架

在windows上配置pvn3d的环境一直配不成功&#xff0c;主要卡在了与C联合编译上&#xff0c;不知道如何处理了。索性先看看代码&#xff0c;竟然发现与论文中的代码对应上了。希望这一段时间把环境配置好。 1.论文中的网络结构 1.RGB图像特征&#xff0c;通过CNN提取特征。深度…

【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;算法 目录​​​​​​​ 前言 一、三路快排的整体思路 二、三路快排的具体实现 1.测试数据、交换函数和三数取中法 2.三路快排函数 三、程序全部代码 总…

无线麦克风推荐哪些品牌,无线麦克风哪个品牌好,好的麦克风推荐

在声音创作与直播的领域里&#xff0c;无线领夹麦克风作为捕捉清晰声音的第一道防线&#xff0c;其重要性不言而喻。传统的有线麦克风及部分无线产品&#xff0c;难以在移动场景下提供稳定、清晰的录音效果&#xff1b;劣质无线领夹麦克风往往音质不稳定&#xff0c;甚至可能在…

富格林:有效隔绝虚假提高出金

富格林指出&#xff0c;现货黄金是一个复杂的市场&#xff0c;虚假交易屡见不鲜。如果在投资过程中遇到虚假现象&#xff0c;一定要严格对待&#xff0c;保障交易的顺利进行以及顺利出金。此外投资者需要总结高效的出金交易策略来应对。以下是富格林给出的几点建议&#xff0c;…

数据库太慢跑崩的一大罪魁

就是非常不起眼的帐号去重计数&#xff0c;用 SQL 写就是 COUNT(DISTINCT …)。 帐号去重计数在商业分析中很常见也有重要的业务意义。这里的帐号可能是用户 ID、银行帐户、手机号、车牌号、…。计算逻辑基本一样&#xff0c;就是从某个时段的历史数据中统计出有多少个帐号满足…

缓存解决方案。Redis 和 Amazon ElastiCache 比较

欢迎来到雲闪世界。Redis 和 Amazon ElastiCache 等缓存解决方案是通过将频繁访问的数据存储在内存中来提高应用程序性能的热门选择。让我们从实施简单性、性能、成本和维护方面对它们进行比较。 实施简单 设置 Redis 需要在基础设施或云实例上安装和配置 Redis 服务器。它可…

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

从虚拟机调用本地API报各种 SSL 连接不上的错误&#xff0c;这给本地调试造成了极大的不便&#xff0c;在被这个问题困扰了多日以后&#xff0c;终于在GitHub上找到答案 基于这个 帖子 &#xff0c;有一个回复 他写了一个帮助类&#xff0c;专门用来调试本地的API&#xff0c;…