首页 万恶的hls-aes128
文章
取消

万恶的hls-aes128

HLS

又开始研究视频流了,让我们先看m3u8的播放.

浏览器可以直接播放m3u8,但是我们经常看见直播流配合hls.js播放,那什么时候用哪个?

  • 原生video标签:你有一个视频文件,转成了标准H.264+AAC+TS格式,放在服务器上供用户点播,且不需要切换清晰度
  • hls.js:做直播(秀场、赛事、会议)
    • 做直播(秀场、赛事、会议)
    • 视频编码是H.265
    • 需要多清晰度自适应,适配不同网络环境的用户
    • 需要精细控制播放(如精确Seek、错误重试、自定义缓存策略)

生成视频流

可以使用ffmpeg

1
2
3
4
5
6
ffmpeg -i 63156181.mp4 \
  -c:v h264 -c:a aac \
  -hls_time 10 \
  -hls_list_size 0 \
  -hls_segment_filename "output_%03d.ts" \
  play.m3u8

这是一种标准的封装

也可以使用一种叫做AES128的对称加密来加密ts流,方法如下

第一步,生成16字节密钥

1
openssl rand 16 > enc.key

第二步,配置密钥描述

1
2
3
4
5
cat > test.txt <<'EOF'
这一行放公网可访问的密钥地址
本地密钥文件路径
IV向量(可选,也是16字节,填入Hex)
EOF

第三步,调用ffmpeg

其实就多加了一行

1
2
3
4
5
6
7
ffmpeg -i 63156181.mp4 \
  -c:v h264 -c:a aac \
  -hls_time 5 \
  -hls_list_size 0 \
  -hls_segment_filename "output_%03d.ts" \
  -hls_key_info_file ./enc.keyinfo \
  play.m3u8

看看m3u8结构

1
2
3
4
5
6
7
8
9
10
11
12
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:14
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.166667,
output_000.ts
#EXTINF:9.966667,
output_001.ts
#EXTINF:9.866667,
output_002.ts
...
#EXT-X-ENDLIST

特殊加密策略

为什么说hls+aes128万恶呢,因为互联网上加密根本没有上面说的这么简单。

很多服务器上了CSRF Token,再加上他们这个所谓“密钥”根本不是16字节,可能比这个长得多,先拉取,然后用自己魔改的脚本解密这个密钥。

这样密钥的计算就需要很多逆向工程了。

本文由作者按照 CC BY 4.0 进行授权