100u 有偿请前端老哥实现解密播放 m3u8 文件

8 天前
 newbie111

1.通过以下命令对影片的明文 m3u8 和 ts 文件进行加密( aes-ecb ):

openssl enc -aes-128-ecb -in decrypt/index.m3u8 -out encrypt/index.m3u8 -K $(echo -n "你自己任意指定的 16 位加密 key" | xxd -p)

openssl enc -aes-128-ecb -in decrypt/001.ts -out encrypt/001.ts -K $(echo -n "你自己任意指定的 16 位加密 key" | xxd -p)

2.前端页面请求到 m3u8 播放链接时解密文件并播放。

这里我上传了一个不到 10 秒的未加密素材供测试,当然你也可以自己找个 mp4 文件切片成 m3u8 然后本地测试解密播放,先提前谢过各位前端老哥了,一旦成功解密播放,立即支付 100u 表达谢意。我的理解是 hls.js 或 crypto.js 之类的库来解密,但我不是专业前端所以改起来有困难。。。 https://drive.google.com/drive/folders/1QPD_E6C34tND0hICVrWIemxjRL-RLnad?usp=sharing

5180 次点击
所在节点    React
57 条回复
yuzo555
8 天前
正确的做法是转码时让 ffmpeg 自动处理,而不是转码后自己去处理。以下方法来自 GPT-4o:

要使用 FFmpeg 将 MP4 格式的视频转码为 HLS 流并使用 HLS 标准加密( AES-128 ),你可以使用以下命令:

ffmpeg -i input.mp4 \
-c:v libx264 -c:a aac \
-hls_time 10 \
-hls_key_info_file key_info_file.txt \
-hls_playlist_type vod \
output.m3u8

在使用这个命令之前,你需要准备一个 key_info_file.txt 文件,其中包含加密密钥信息。该文件的格式如下:

key_uri
key_file_path
key_iv

key_uri:在播放列表中引用密钥的 URI (通常是密钥的 URL )。
key_file_path:包含实际密钥的文件路径。
key_iv:初始化向量( IV ),如果不指定,FFmpeg 会自动生成。
例如:

https://example.com/keys/key.bin
./key.bin
0123456789abcdef0123456789abcdef

你还需要生成一个 16 字节的密钥,并将其保存到 key.bin 文件中。可以使用以下命令生成随机密钥:

openssl rand 16 > key.bin
请确保 key_info_file.txt 和 key.bin 文件的路径正确,并根据你的需求调整 FFmpeg 命令中的参数。
newbie111
8 天前
@yuzo555 你好我知道这种官方标准加密方式的,直接 ffmpeg 就行,前端不需要任何处理,弊端就是任何人能拿到文件链接的情况下都能播放,不能够满足我这边的需求。
newbie111
8 天前
ffmpeg 官方加密的方式,即使有防盗链,也可以通过批量下载的方式拿到可播放的文件。
dullwit
8 天前
DRM ?
LuckyLauncher
8 天前
这个是自己加密前端实现解密?那不就相当于没加密?
newbie111
8 天前
@LuckyLauncher 不能这么说吧,玩 next.js 一把梭的时候各种数据库相关的配置不也是存放在前端项目的.env 里,只要解密 key 不暴露即可。可以理解为前后端约定好了一套加解密规则,后端加密数据,前端取到后按约定好的规则进行数据解密。
LuckyLauncher
8 天前
@newbie111 #6 你在说些啥?你把.env 放到前端让人可以访问到?你把地址放出来等一会你看看你数据库还在不在
LuckyLauncher
8 天前
@newbie111 #6
“只要解密 key 不暴露即可”
“前端取到后按约定好的规则进行数据解密”
你就说你的前端解密需不需要 key
dzdh
8 天前
通通加密后。你 m3u8 的解密密钥怎么下发。写死到网页里?通过接口获取?

还是仅仅防一下小白而已?
dzdh
8 天前
感觉还是服务端做鉴权靠谱
helone
8 天前
100u 怕是有点少
wbrobot
8 天前
你这种就是请人定做一个 hls.js 嘛,获取到视频流之前前端解密一下,再拼成新的视频交给播放器播放。
你直接说定制 hls.js 就行了,什么算法都能实现,甚至不用全文件加密,只需要很短的 aes 随机替换 ts 中间的几个字节,盗播的人都播不了。
registerrr
8 天前
没盯上你的,用 ffmpeg 自带的加密也足够了。真盯上你的,只要你的前端有解密逻辑,有什么破不了的,都能破。防防小白而已
paradox8599
8 天前
@newbie111 不是吧,nextjs 的 env 只有 `NEXT_PUBLIC_` 开头的才会 1 暴露给前端呀
yb2313
8 天前
是我想的那种网站吗, 让我看看
qq78660651
8 天前
你想要实现的功能 和 alist 的 crypt 的文件加密功能相似呀,可以参考他的代码。
下载学习资料,加密后上传云盘,云盘存储的是加密后的文件,然后云盘播放时,实时解码观看,等于小带宽换大带宽。
相当于客户端负责加密和解密,文件在云端是加密存储的。
purringpal
8 天前
如果是特定用户才能看,你就把密钥分发给他们,至于前端加解密,聊胜于无吧
lyxxxh2
8 天前
@newbie111

"不也是存放在前端项目的.env 里,只要解密 key 不暴露即可"
`next.js`我没用过,但听过,`next.js` 严格来说是后端。

跟 laravel 差不多, `.env`客户不知道。
如果我在模板引擎:
```
<script>
key = {{ env('key') }}
</script>
```
客户浏览器可以看得到吧。
***
或许你说我不定义,那 js 怎么拿 key 解密?
除非你有个登录,让用户绑定 key 。
SingeeKing
8 天前
这种我做过,基于 hls.js 改的,但是 100u 确实少了点
wen20
8 天前
.ts 都是绝对路径的话,可以试下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1071836

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX