V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jiobanma
V2EX  ›  程序员

存在 OSS 上的 mp4 文件如何加密(禁止下载)

  •  
  •   jiobanma ·
    banmajio · 2022-03-02 17:49:49 +08:00 · 4143 次点击
    这是一个创建于 1006 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是存在 OSS 上的一些 mp4 文件,只能通过 web 系统内的播放器播放,但是不能通过 F12 这种方式扒到的播放器标签存的 src 里面的原文件地址单独拿出去下载.也就是说即使拿到源文件地址也不能正常预览.

    有大佬知道好的实现思路吗?

    29 条回复    2022-03-03 13:31:06 +08:00
    009694
        1
    009694  
       2022-03-02 17:53:46 +08:00 via iPhone
    不让下载 那还可以录屏
    jiobanma
        2
    jiobanma  
    OP
       2022-03-02 17:55:50 +08:00
    @009694 当然不可能堵住所有的口子,只能说是防君子不防小人,能加点门槛就加点
    yannxia
        3
    yannxia  
       2022-03-02 17:56:00 +08:00
    本地解码的时候解密嘛,有点像优酷之类的,下载下来的视频都是需要解密的,但是录屏就防不住,还有模拟输出设备的录屏就更没戏了,
    jiobanma
        4
    jiobanma  
    OP
       2022-03-02 17:57:39 +08:00
    @yannxia 因为只是一个简单的播放,就是前端一个播放器直接拿到源文件的地址去播放,所以增加视频编解码的话成本太高了
    tieqishan07li
        5
    tieqishan07li  
       2022-03-02 17:57:55 +08:00
    设置防盗链、使用 STS Token 拿资源
    vone
        6
    vone  
       2022-03-02 17:59:36 +08:00
    wu67
        7
    wu67  
       2022-03-02 18:00:58 +08:00
    换成 m3u 咯, 让播放器自己加载. 然后再整点 token, 定期刷新.
    gadfly3173
        8
    gadfly3173  
       2022-03-02 18:01:32 +08:00
    私有 bucket + sts token 或自行实现前置访问认证,sts 应该是成本最低的方案了,不过用户稍稍看下请求也是能当场下下来的
    jiobanma
        9
    jiobanma  
    OP
       2022-03-02 18:01:49 +08:00
    @wu67 m38u 的话 得加一道流媒体服务了吧
    Qusic
        10
    Qusic  
       2022-03-02 18:02:02 +08:00 via iPhone
    m3u8 做 streaming ?这样视频分片存储,一方面拖进度条的用户体验会很大提升,另一方面大部分用户都不知道怎么转码合并视频吧,我猜。另外把分片的视频流放前端 blob 里那难度就更大了
    jiobanma
        11
    jiobanma  
    OP
       2022-03-02 18:03:33 +08:00
    @Qusic 提供给我们的视频就是一个 mp4 格式的,如果切片的话,还要有个流媒体服务去切片放到 oss 里 那成本有点高了
    jiobanma
        12
    jiobanma  
    OP
       2022-03-02 18:03:52 +08:00
    @vone 这得二开播放器了吧
    cssk
        13
    cssk  
       2022-03-02 18:05:29 +08:00 via iPhone
    token ,header
    gam2046
        14
    gam2046  
       2022-03-02 18:10:03 +08:00
    不嫌麻烦就是 hls + aes ,前端自行获取密钥,通过 ffmpeg wasm 播放。

    再简化一点的方案,blob url 就足够挡住多数 F12 的初级用户了。
    wu67
        16
    wu67  
       2022-03-02 18:11:21 +08:00
    @jiobanma 各种云应该有相应的服务吧. 考虑一下用现成的咯, 干嘛自己肝.
    misdake
        17
    misdake  
       2022-03-02 18:17:04 +08:00
    可能对楼主的问题没啥帮助,只是沿着 m3u8 的路提一句今天的小发现
    今天下 wordpress 一个视频的时候,发现是静态 m3u8+静态单视频文件。视频文件可能是根据关键帧切分的,在拼接的时候直接二进制拼接,两端和切片之间都夹杂脏数据,m3u8 用#EXT-X-BYTERANGE 指向视频的一段段数据。这样直接下载文件是放不出来的。
    但是,m3u8 没有任何保护,直接用 m3u8 下载就行了。。。
    liuidetmks
        18
    liuidetmks  
       2022-03-02 18:21:21 +08:00
    添加 DRM ?
    LnTrx
        19
    LnTrx  
       2022-03-02 18:54:03 +08:00
    楼主先明确一下,blob url 这种程度够不够?
    shellc
        20
    shellc  
       2022-03-02 18:56:08 +08:00
    楼上有提到使用阿里云的视频加密方案,这个方案需要使用阿里云的播放器,同时如果能接受视频云的计费方式是可以的。

    如果你的需求只是为了解决 Web 播放视频,并阻止通过查看网页源代码获取 URL 下载,并且不考虑爬虫的话。有一个方案你可以考虑。这个方案的核心就是 OSS 的 URL 是一次性的。可以把 bucket 或文件设置为 private 可见,在网页中输出的视频地址通过 OSS 的签名来访问,签名设置有效期为 10 秒,只要视频播放器在 10 秒内开始访问 OSS ,视频就可以顺利播放。超过 10 秒后,这个 URL 过期。10 秒是个经验值,就是浏览器从提交请求,到播放器开始访问 OSS 的超时时间。

    绕过的方法就是写脚本自动化爬取,直接访问页面拿到地址开始下载。
    cxy2244186975
        21
    cxy2244186975  
       2022-03-02 19:03:18 +08:00 via Android
    这几是一个好问题
    lsp 程序员马上捶死你
    HUNYXV
        22
    HUNYXV  
       2022-03-02 19:03:27 +08:00
    Buges
        23
    Buges  
       2022-03-02 19:41:46 +08:00 via Android
    随便加点鉴权(非加密),自然就不能拿到文件地址直接下载。
    ragnaroks
        24
    ragnaroks  
       2022-03-02 19:58:24 +08:00
    blob ,分片,加密流

    fetch 先拿到原始加密字节数组后解密,解密的 key 可以直接写死,再喂给 blob 播放
    icy37785
        25
    icy37785  
       2022-03-02 20:33:15 +08:00 via iPhone
    只要能够在线播放,那么久没有任何办法可以禁止下载,只能通过加密视频流的方式让他们下载回去没办法直接播放。你又不愿意对视频加密,那就没办法实现了。
    yuzo555
        26
    yuzo555  
       2022-03-02 20:42:14 +08:00
    @shellc
    网页浏览器加载视频播放(以及多线程下载工具的下载)都不是单线程一次请求下载完的,都是边播边下载,很多 Range: bytes=x-x 的请求,播放暂停之后,缓冲一两分钟加载也就暂停了,恢复播放就会重新连接下载,这个时间不能是十秒,只能比用户完整播放的时间要长...;

    上面说的 STS 也是不行的,属于是没看清楼主的需求,STS 只是相当于加了一个链接失效时间,用户抓到之后只要链接没失效还是可以下载的,而且嗅探工具(例如 IDM )还是可以直接下载;

    Blob 方案只是隐藏了在 F12 - 元素和源代码里面的地址,并没有解决 F12 - 网络里面抓包的方案,而且用户如果安装了嗅探工具或者插件的话还是可以下载到;

    ffmpeg wasm 方案的话,我只能说够折腾的,用户浏览器有那加载 ffmpeg 的时间,视频早下载完了。。。而且还是没有解决隐藏地址的问题;

    稍微可行的方案是自编 MSE ,但这样太复杂了,也可以直接用现成的 flv.js 、HLS.js 或者 Dash.js ,但注意不能直接给个 M3U8 给他就播放,需要做点混淆。

    现成的方案可以考虑 #15 提到的,也就是我们多吉云的防嗅探下载功能,是完全免费的,视频上传后复制代码贴到网页上即可使用,可以体验下: https://docs.dogecloud.com/vcloud/manual-anti-sniffer
    流量的话每月免费 20GB ,超出部分最高 ¥ 0.11 / GB 。

    如果视频比较重要舍得花钱的话,可以考虑我们的防盗水印功能: https://docs.dogecloud.com/vcloud/manual-unique-watermark
    wangfei324017
        27
    wangfei324017  
       2022-03-02 21:39:41 +08:00
    其实 blob 完全够了- -

    遇到 blob 的我就束手无策了,F12 搜 m3u8 都搜不到
    vibbow
        28
    vibbow  
       2022-03-03 12:07:10 +08:00
    第一个想到的是开 DRM.
    skiy
        29
    skiy  
       2022-03-03 13:31:06 +08:00
    @wangfei324017 也还是要加载 m3u8 的。当然,直接扒源码拿不到而已。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:00 · PVG 12:00 · LAX 20:00 · JFK 23:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.