V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
edis0n0
V2EX  ›  程序员

有什么能通过不受信任节点安全防篡改分发文件的方法吗?

  •  
  •   edis0n0 · Oct 19, 2022 · 3419 views
    This topic created in 1297 days ago, the information mentioned may be changed or developed.

    需求是给客户分发视频、压缩包等大文件,大家都知道国内网盘下载不是限速就是要注册、下客户端,直接这样分享太不专业了(知道某些企业网盘可以但不太想用,还是想完全可控,用自己域名),大厂对象存储流量又很贵,于是买了几个小商家的大带宽服务器搭 MinIO 节点(大厂的可信任主节点通过 MinIO 的 replication 功能实时分发文件给这些小商家节点,客户访问的时候随机 301 到一个在线节点)。但还存在 1 个问题,这些小厂的信誉无法保证他们不会偷偷替换我硬盘上的文件(服务器在他们那,实施起来完全没有技术难度)目前想到的方案是像 Mega 网盘分享那样下载到浏览器缓存中,解密后再存盘,但问题是兼容性可能不是很好,需要用户系统盘剩余容量大于我分享的文件大小(大家都知道很多国内用户系统盘分区分得很小,动不动就满)也不符合国内用户的使用习惯。有没有 V 友有更好的方案?

    Supplement 1  ·  Oct 19, 2022
    那些 PCDN 是怎么解决这个问题的?百度网盘的客户端下载地址 https://pan.baidu.com/download https://issuepcdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.20.2.2.exe 解析出来一堆家宽 IP ,难道这些放用户家的节点都能随意发送篡改后的文件?如果用 socat 这类工具反代,中心服务器加解密那必须全回源( SSL 貌似每次协商的密钥都不一样),PCDN 意义何在?
    44 replies    2022-10-20 09:02:02 +08:00
    7RTDKSAK
        1
    7RTDKSAK  
       Oct 19, 2022
    参考发行版 ISO 分发?

    发送端:计算出大文件的 SHA SUM,然后 GPG 为 HASH LIST 签名

    接收端:预置发送端公钥,校验
    edis0n0
        2
    edis0n0  
    OP
       Oct 19, 2022
    @7RTDKSAK #1 问题是这要集成进分发网页的话只能像 Mega 网盘分享那样下载到浏览器缓存中再操作,我们客户可不知道 checksum 、签名是什么
    edis0n0
        3
    edis0n0  
    OP
       Oct 19, 2022
    搞个下载器什么的用户体验还不如网盘
    hahastudio
        4
    hahastudio  
       Oct 19, 2022
    不太理解,如果你考虑到小厂的存储不稳定,文件可能会损坏的话,那考虑技术上的方法,比如压缩包带校验恢复信息之类的
    但如果你担心他们会替换你的文件的话,为什么你要选择这些小厂?
    edis0n0
        5
    edis0n0  
    OP
       Oct 19, 2022
    @hahastudio #4 明显是成本问题,带宽比大厂便宜很多
    Zhai2333
        6
    Zhai2333  
       Oct 19, 2022 via Android
    你可以用 MinIO 的 Server-side Encryption 。
    edis0n0
        7
    edis0n0  
    OP
       Oct 19, 2022
    @Zhai2333 #6 SSL 证书还是要放在这些边缘节点上,无法解决通过中间人攻击篡改。
    eason1874
        8
    eason1874  
       Oct 19, 2022
    像版权视频那样分片,几十 MB 一片,收到一片解密一片,也就多用一两百 MB 内存,不存在客户端硬盘容量不够用的情况
    lolizeppelin
        9
    lolizeppelin  
       Oct 19, 2022
    压缩文集添加密码分段压缩不就行了
    lcy630409
        10
    lcy630409  
       Oct 19, 2022
    文件转成 exe 自解压签名,搞个几 kb 的小工具,在里面下载你们的文件,下载完之后验证签名?
    edis0n0
        11
    edis0n0  
    OP
       Oct 19, 2022
    @eason1874 #8 可以试试下载一个 mega 网盘的分享,这种实现即使分段存盘前用的也都是系统盘空间。

    @lolizeppelin
    @lcy630409 搞下载器体验就比网盘还烂了。

    另外发现那些 PCDN 是怎么解决这个问题的?百度网盘的客户端下载地址 https://pan.baidu.com/download https://issuepcdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.20.2.2.exe 解析出来一堆家宽 IP ,难道这些放用户家的节点都能随意发送篡改后的文件?如果用 socat 这类工具反代,中心服务器加解密那必须全回源( SSL 貌似每次协商的密钥都不一样),PCDN 意义何在?
    Zhai2333
        12
    Zhai2333  
       Oct 19, 2022 via Android
    @edis0n0 SSL Certificate 可以放在記憶體裡。除非刻意針對,我不覺得這些廠家會閒到去 dump 出來抓。
    lonewolfakela
        13
    lonewolfakela  
       Oct 19, 2022
    "难道这些放用户家的节点都能随意发送篡改后的文件?" 百度网盘有自己的客户端,客户端里下载了数据之后和可信服务器上下发的 hash 值比对一下就好了

    话说像这样大面积分发文件的话如果可以考虑用 torrent 种子的话可能会轻松一点?
    oldshensheep
        14
    oldshensheep  
       Oct 19, 2022
    PCDN 不了解,但是我猜想肯定是文件是通过不可信节点传输,但是校验信息通过可信节点传输。
    edis0n0
        15
    edis0n0  
    OP
       Oct 19, 2022
    @lonewolfakela #13
    @oldshensheep #14 我发的链接就是百度网盘客户端本体的下载地址啊,官网上的就是这个链接
    oldshensheep
        16
    oldshensheep  
       Oct 19, 2022
    可以这样,客户端,传输文件完成后,通过百度的服务器获取文件的校验信息,然后客户端校验即可保证文件不被篡改。
    edis0n0
        17
    edis0n0  
    OP
       Oct 19, 2022
    @oldshensheep #14 浏览器通过官网下载客户端打开的就是这个地址,应该实现不了 文件是通过不可信节点传输,但是校验信息通过可信节点传输
    fengjianxinghun
        18
    fengjianxinghun  
       Oct 19, 2022
    这个场景不用自建 ipfs ?
    oldshensheep
        19
    oldshensheep  
       Oct 19, 2022
    那应该是 PCDN 软件有校验措施
    Kinnice
        20
    Kinnice  
       Oct 19, 2022
    比如说你是用 nginx 来提供 web 下载服务,那你的 nginx 就应该具有校验的能力(举例)
    eason1874
        21
    eason1874  
       Oct 19, 2022
    @edis0n0 #11 你别整个缓存在浏览器啊,你在浏览器起个 Service Worker 做代理,下载一片解密推给前台,再下载一片解密推给前台
    lonewolfakela
        22
    lonewolfakela  
       Oct 19, 2022
    @edis0n0 #15 哦你说的是那个客户端软件本身的下载地址?
    我看 issuepcdn.baidupcs.com 是解析到一堆百度云加速 CDN 节点的啊,你确定那些是家宽?
    oldshensheep
        23
    oldshensheep  
       Oct 19, 2022
    可以这么搞,现代浏览器支持直接访问本地硬盘(需要授权),然后你直接下载就行了,然后在浏览器校验。
    客户是小白应该没人用 Firefox 吧,支持 Chrome 86 及以上内核的浏览器。

    再不行的话就分片下载校验……
    tool2d
        24
    tool2d  
       Oct 19, 2022
    @edis0n0 "搞下载器体验就比网盘还烂了。"

    用下载器也没什么的,原神下载器能把我 400M 的带宽跑满,下载 40G 的游戏资源轻轻松松。

    换成普通浏览器下载,基本不可能。
    ysc3839
        25
    ysc3839  
       Oct 19, 2022
    PCDN 可以在客户端进行校验,如果客户端不校验的话那确实有安全问题。
    ysc3839
        26
    ysc3839  
       Oct 19, 2022
    个人印象中 PCDN 一般不会用来做普通的 HTTP 下载,因为拥有公网 IP 的用户不多,未备案的家宽提供 HTTP 服务也有法律风险,大多是配合客户端或者网页,使用一些 P2P 的协议进行传输的。
    nVic
        27
    nVic  
       Oct 19, 2022
    客户需要什么?无客户端、高速下载文件。
    你需要什么?自定义域名,安全分享文件。

    有个项目叫做 webtorrent ,可以直接免客户端实现 p2p 下载。
    拿过来改改入口和界面就好了。
    disk
        28
    disk  
       Oct 19, 2022
    用户提供的 pcdn 一般不会有 http 服务,见过的都是走 UDP 的 P2P 服务。
    上面百度网盘的是边缘机房,家宽哪来的 443 。
    p2p 保证完整性要靠校验的,如果是流媒体信息也不太需要保证完整性。
    网盘的 P2P 加速是要靠客户端的,网页没有。
    还是 mega 那种方案好点,就做个校验。
    lolizeppelin
        29
    lolizeppelin  
       Oct 19, 2022
    怕运营商拆盘直接加密硬盘不就行了,登不进系统也没法解密拿到硬盘上的数据不就完了

    走 https 不怕数据拦截...啥都不用折腾
    Kiriya
        30
    Kiriya  
       Oct 19, 2022
    所以客户端的一个作用就是用来校验文件是否被篡改
    ren2881971
        31
    ren2881971  
       Oct 19, 2022
    签名验签
    yuzo555
        32
    yuzo555  
       Oct 19, 2022
    签名算法就是给你来干这个的呀,最简单的,对比下 MD5 。

    如果你觉得客户端环境不可控,或者觉得让用户验 MD5 麻烦,你可以自己在 Web 浏览器端实现一个下载器,大小文件都支持,参考 StreamSaver 这个项目。
    Jooooooooo
        33
    Jooooooooo  
       Oct 19, 2022
    运行前校验一下呗.
    t133
        34
    t133  
       Oct 19, 2022 via iPhone
    IPFS
    janxin
        35
    janxin  
       Oct 19, 2022
    文件签名,文件 hash
    flynaj
        36
    flynaj  
       Oct 19, 2022 via Android
    文件签名发出来,所有网盘发一遍,参看 https://www.itsk.com/thread-425419-1-1.html
    edis0n0
        37
    edis0n0  
    OP
       Oct 19, 2022
    能不能现实点,我的客户全是连 exe 和 docx 都分不清楚的那种,还指望他们懂验签?所以我想把这个功能集成进下载网页,对用户无感,发现被篡改就禁止保存。

    @yuzo555
    @flynaj
    @janxin
    @ren2881971
    Shorekeeper
        38
    Shorekeeper  
       Oct 19, 2022
    @edis0n0

    可以看一下 Tails OS 的下载界面,有个 Web 实现的文件验证,只需要用户选择下载好的文件就可以校验。
    Verify your download https://tails.boum.org/install/windows/index.en.html

    那就像 Mega 网盘,在客户端网页下载好文件,然后校验,如果不过就不给用户?不清楚能不能实现。
    KagurazakaNyaa
        39
    KagurazakaNyaa  
       Oct 19, 2022
    @edis0n0 那你直接用 wasm 每个分片都验证 hash 不就好了,有硬件加速算 sha 和 md5 都是飞快的
    Shorekeeper
        40
    Shorekeeper  
       Oct 19, 2022
    @SunsetShimmer 因为提到 Mega 的方法不太行,那就只能让用户自己选择了...
    Shorekeeper
        41
    Shorekeeper  
       Oct 19, 2022
    @SunsetShimmer 这个 sha256 的实现在 https://tails.boum.org/install/inc/js/download.js ,主要在 verifyFile 函数,貌似也引用了 https://tails.boum.org/install/inc/js/forge.sha256.min.js
    9268peng
        42
    9268peng  
       Oct 20, 2022
    某 pcdn 在某电视上的使用简化:在电视上运行 pcdn 的 sdk 并监听一个本机端口,电视把播放地址通过这个端口给星域的 sdk ,然后就可以接受视频了。
    百度的做法,我理解是在家宽做的这个 sdk ,或者你绕过本地的客户端下载就是无法验证篡改的,我觉得你把他们的安全想的太好了。。
    baobao1270
        43
    baobao1270  
       Oct 20, 2022
    比较好的做法:提供 HASH 或 GPG 签名,并教育用户验证 HASH
    最节约成本的做法:带密码的 ZIP 压缩包
    julyclyde
        44
    julyclyde  
       Oct 20, 2022
    按你这个“给客户分发视频……等大文件”的需求
    应该直接邮寄硬盘

    目前电影行业就是这么搞的,直接快递硬盘,里边存着加密的视频文件。电影院用 U 盾在线申请播放密钥来解密
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1130 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 98ms · UTC 23:07 · PVG 07:07 · LAX 16:07 · JFK 19:07
    ♥ Do have faith in what you're doing.