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
举报· 627 次点击
登录 注册 站外分享
38 条回复  
caola 小成 2024-9-12 02:18:00
解密的密钥 key 放在 wasm 里面,多弄几个变量混淆一下密钥,还可以加入其他的参数进行校验(例如:服务器给出一个加密后的时间戳,wasm 解密这个参数后校验这个时间在一定的范围内就允许解密操作),然后再编译成二进制。一般能破解的概率小很多了。  
js 把加密的数据和参数传入 wasm 解密后的数据反回给 js 。
sunchuo 小成 2024-9-11 21:41:01
@Yaavi star 了。感谢。
wuzzispacelake 小成 2024-9-11 21:26:40
@Yaavi 想提个问,简单看了一下代码,看起来 decryptTSAES 是拿去的 fetch 下来的全量 ArrayBuffer ,但是我个人理解对于 TS 这样的视频文件不是流式处理不会出问题吗
GooMS 小成 2024-9-11 21:21:47
掩耳盗铃
pxiphx891 小成 2024-9-11 21:15:28
我理解,解密密钥应该在这个 js 文件里,谁能教教我,怎么找到解密密钥?我打断点找了半天也没找着

https://decipher-m3u8.yaavi.me/assets/index-DCANJRc2.js
k9982874 小成 2024-9-11 18:50:40
问问 ai 用 js 怎么 sha256 加密解密文件不就完事了。。
jjl19960910 小成 2024-9-11 18:47:24
@Ipsum #35 hh 笑死
aycclm 小成 2024-9-11 18:44:43
你们真的是卷死了 [手动狗头]
100u 还真给做了
Yaavi 小成 2024-9-11 18:40:21
上午写完的,但联系不上,还能拿到 100u 么 [狗头]
Demo:[https://decipher-m3u8.yaavi.me/]( https://decipher-m3u8.yaavi.me/)
azhangbing 小成 2024-9-11 17:30:13
31 楼正确 你只需要重写 class CustomFragmentLoader extends Hls.DefaultConfig.loader 的 load 方法就行了

    load(context, config, callbacks) {
        const onSuccessOriginal = callbacks.onSuccess;

        callbacks.onSuccess = (response, stats, context) => {
            if (context.frag && context.frag.url && context.frag.url.includes('.ts')) {
                const encryptedData = new Uint8Array(response.data);
                const filenameBase = this.extractFilename(context.frag.url);

   

                const decryptedData = xorDecrypt(encryptedData, this.keyBytes);
                response.data = decryptedData.buffer;

   
            }
            onSuccessOriginal(response, stats, context);
        };

        super.load(context, config, callbacks);
    }
1234下一页
返回顶部