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

66 天前
 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

5947 次点击
所在节点    React
57 条回复
yuzo555
66 天前
正确的做法是转码时让 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
66 天前
@yuzo555 你好我知道这种官方标准加密方式的,直接 ffmpeg 就行,前端不需要任何处理,弊端就是任何人能拿到文件链接的情况下都能播放,不能够满足我这边的需求。
newbie111
66 天前
ffmpeg 官方加密的方式,即使有防盗链,也可以通过批量下载的方式拿到可播放的文件。
dullwit
66 天前
DRM ?
LuckyLauncher
66 天前
这个是自己加密前端实现解密?那不就相当于没加密?
newbie111
66 天前
@LuckyLauncher 不能这么说吧,玩 next.js 一把梭的时候各种数据库相关的配置不也是存放在前端项目的.env 里,只要解密 key 不暴露即可。可以理解为前后端约定好了一套加解密规则,后端加密数据,前端取到后按约定好的规则进行数据解密。
LuckyLauncher
66 天前
@newbie111 #6 你在说些啥?你把.env 放到前端让人可以访问到?你把地址放出来等一会你看看你数据库还在不在
LuckyLauncher
66 天前
@newbie111 #6
“只要解密 key 不暴露即可”
“前端取到后按约定好的规则进行数据解密”
你就说你的前端解密需不需要 key
dzdh
66 天前
通通加密后。你 m3u8 的解密密钥怎么下发。写死到网页里?通过接口获取?

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

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

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

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

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

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

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

© 2021 V2EX