New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
流媒体加密 #10
Comments
点赞了,我之前对HLS稍有研究,也没有找到相应成熟的解决方案,但我想方向应该是:
对于rtmp,网上有一些rtmps协议的内容,但我个人更倾向使用hls协议 |
写的真不错。 有一点没搞懂
如您所说,为什么不进行鉴权,以避免“任何人”都能获取你的视频。 反而要大费周张在视频数据本身上加密? |
好文,赞!@tixo 原文有说,加密视频本身是防止正常用户下载视频然后传播 |
您好,看了您的文章,有疑惑的地方在 streaming -> �取得 ts file -> 加密 ts file -> 储存 ts file |
HLS 加密直播
点播
|
加密是否必须要用服务器支持? |
如果使用 # 生成加密key
openssl rand 16 > enc.key
# 生成IV
openssl rand -hex 16
# 新建enc.keyinfo,内容如下
http://localhost/video/enc.key
enc.key
191029d9c2d4e9051a8a5deb2f7f5c04
# 以加密hls.mkv为例
ffmpeg -i hls.mkv \
-codec:v libx264 \
-codec:a mp3 \
-map 0 \
-s 640x360 \
-hls_time 10 \
-hls_list_size 0 \
-hls_allow_cache 1 \
-hls_base_url http://localhost/videos/ \
-hls_segment_filename out%03d.ts \
-hls_key_info_file enc.keyinfo \
playlist.m3u8 部分参数解析
|
所以myfreecams.com 的直播一直是那种加密? |
HLS 容易实现加密 还是因为它本质上是个伪流协议 |
求解密方法 |
1 similar comment
求解密方法 |
YouTube 的视频流就是加密的 |
没有吧,不是youtube-dl直接下吗 |
解密完全不需要key,由于目前hls解密通常都是通过应用自身去解的,这也就意味着解密后的数据会直接暴露在代码逻辑里。直接抓取解密后的视频数据,回传自己的服务器,再在服务器进行合并操作,就是一个可播放的完整视频了,至少在web是这样,客户端想来也只是难度加大了而已。 |
bilibili的加密方式是怎么样的?我看他们的video的视频源就是一串简单的域名+一串加密过的字符 |
已收到,谢谢!
|
为什么要加密视频
付费观看视频的模式是很多平台的核心业务,如果视频被录制并非法传播,付费业务将受到严重威胁。因此对视频服务进行加密的技术变得尤为重要。
本文所指的视频加密是为了让要保护的视频不能轻易被下载,即使下载到了也是加密后的内容,其它人解开加密后的内容需要付出非常大的代价。
无法做到严格的让要保护的视频不被录制,原因在于你需要在客户端播放出视频的原内容,解密的流程在客户端的话不法分子就能模拟整个流程,最保守也能用屏幕录制软件录制到视频的原内容(可以通过加水印的方法缓解下)。我们的目标是让他获取原内容的代价更大。
常见视频加密技术
视频加密技术分为两种:
一般结合这两种技术一起用,第1种技术很成熟也有很多教程就不再复述,本文主要介绍第2种加密技术。
流媒体加密技术原理
看视频分为两种,看点播和看录播。
要看点播可以通过下载完整个视频后再看,或者通过流媒体边下边看。
看直播只能通过流媒体看最新的画面。
加密整个视频的技术很简单,把视频看成一个文件采用加密文件的技术,这种技术太多就不介绍了。
加密流媒体的技术很少,也很难找到学习资料,本文主要介绍流媒体加密技术。
常见的应用与浏览器播放的流媒体传输协议有:
流媒体加密原理
可以看出一个规律这些流媒体传输协议都必须把视频流拆分成连续的小块之后再被传送,只不过分块的大小和视频容器的格式不一样而已。
流媒体加密技术的核心就在于对这每一小块视频分别使用对称加密算法,在服务端加密客户端解密,通过权限验证的用户才能拿到解密一小块视频的密钥。
为什么不用 HTTPS 加密
可能有人会问为什么不用 HTTPS 加密?原因是 HTTPS 在网络传输层进行非对称加密,目的是为了防止中间人窃听劫持,任何人都可以和我们的服务器建立 HTTPS 链接获取到原数据。而视频加密的目的不是为了防止有中间人窃听我们的视频数据,而是要让视频数据本身被加密。
为什么选择对称加密
现代成熟的加密技术分为对称加密算法和公钥密码算法(非对称加密)。之所以选择对称加密是因为流媒体要求很强的实时性,数据量又很大。公钥密码算法的计算都比较复杂,效率较低,适合对少量数据进行加密。对称加密效率相对较高,所以流媒体加密首选对称加密。例如在 SSH 登入的时候会先通过公钥密码算法传输一个密钥,再用这个密钥用作对称加密算法的密钥,在数据传输过程中使用对称加密算法来提示数据传输效率。
HLS 加密
HLS 是目前最成熟的支持流媒体加密的能应用在浏览器里的流媒体传输协议,HLS 原生支持加密,下面来详细介绍它。
在介绍如何加密 HLS 先了解下 HLS 相比于其它流媒体传输协议的优缺点。
优点在于:
缺点在于:
HLS 加密原理
HLS 由两部分构成,一个是 .m3u8 文件,一个是 .ts 视频文件(TS 是视频文件格式的一种)。整个过程是,浏览器会首先去请求 .m3u8 的索引文件,然后解析 m3u8,找出对应的 .ts 文件链接,并开始下载。

m3u8 文件是一个文本文件,在开启 HLS 加密时,内容大致如下:
这个文件描述了每个 TS 分片的 URL ,但这些分片都是加密后的内容,要还原出原内容需要从
中解析出获取解密密钥的URL
https://priv.example.com/key.do
和对称加密算法AES-128
。获取到密钥后再在客户端解密出原内容。
可以看出启用 HLS 加密后会多出更多的事情:
这会带来更多的网络请求和计算量,可能会对延迟和性能造成一定的不良影响。
HLS 加密实战
支持 HLS 的客户端都原生支持加密,所以要开启 HLS 加密你只需要修改你的服务端:
EXT-X-KEY
字段。https://priv.example.com/key.do?k=1
所指向的服务。目前大多数云服务都支持 HLS 加密服务,如果你想直接搭建 HLS 加密服务可以使用 nginx-rtmp-module。
HLS 兼容方案
目前 HLS 存在兼容性问题:
flashls 和 hls.js 都支持 HLS 加密技术。
破解 HLS 加密
有加密就有破解,在明白 HLS 加密原理后,你想过如何去破解它吗?先定义下破解成功是指:获取到视频加密前的完整原文件。我想到的方法是:
似乎破解的难度也不会很复杂。
总结
目前流媒体加密技术还不成熟,除了 HLS 协议提供了方便成熟的方案外,其它协议的加密技术还不成熟。
RTMP 协议提供了一个变种版 RTMPE 可以加密流媒体,原理和 HLS 加密类似,但是我还找不到合适的服务端去支持 RTMPE 协议。
阅读原文
The text was updated successfully, but these errors were encountered: