有什么能通过不受信任节点安全防篡改分发文件的方法吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
edis0n0
V2EX    程序员

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

  •   edis0n0 2022-10-19 15:44:31 +08:00 3067 次点击
    这是一个创建于 1120 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    接收端:预置发送端公钥,校验
    edis0n0
        2
    edis0n0  
    OP
       2022-10-19 16:07:03 +08:00
    @7RTDKSAK #1 问题是这要集成进分发网页的话只能像 Mega 网盘分享那样下载到浏览器缓存中再操作,我们客户可不知道 checksum 、签名是什么
    edis0n0
        3
    edis0n0  
    OP
       2022-10-19 16:07:27 +08:00
    搞个下载器什么的用户体验还不如网盘
    hahastudio
        4
    hahastudio  
       2022-10-19 16:09:36 +08:00
    不太理解,如果你考虑到小厂的存储不稳定,文件可能会损坏的话,那考虑技术上的方法,比如压缩包带校验恢复信息之类的
    但如果你担心他们会替换你的文件的话,为什么你要选择这些小厂?
    edis0n0
        5
    edis0n0  
    OP
       2022-10-19 16:10:37 +08:00
    @hahastudio #4 明显是成本问题,带宽比大厂便宜很多
    Zhai2333 div class="fr">     6
    Zhai2333  
       2022-10-19 16:12:30 +08:00 via Android
    你可以用 MinIO 的 Server-side Encryption 。
    edis0n0
        7
    edis0n0  
    OP
       2022-10-19 16:14:19 +08:00
    @Zhai2333 #6 SSL 证书还是要放在这些边缘节点上,无法解决通过中间人攻击篡改。
    eason1874
        8
    eason1874  
       2022-10-19 16:17:33 +08:00
    像版权视频那样分片,几十 MB 一片,收到一片解密一片,也就多用一两百 MB 内存,不存在客户端硬盘容量不够用的情况
    lolizeppelin
        9
    lolizeppelin  
       2022-10-19 16:17:57 +08:00
    压缩文集添加密码分段压缩不就行了
    lcy630409
        10
    lcy630409  
       2022-10-19 16:18:43 +08:00
    文件转成 exe 自解压签名,搞个几 kb 的小工具,在里面下载你们的文件,下载完之后验证签名?
    edis0n0
        11
    edis0n0  
    OP
       2022-10-19 16:22:38 +08:00
    @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  
       2022-10-19 16:24:13 +08:00 via Android
    @edis0n0 SSL Certificate 可以放在。除非刻意,我不得些家到去 dump 出抓。
    lonewolfakela div class="fr">     13
    lonewolfakela  
       2022-10-19 16:25:51 +08:00
    "难道这些放用户家的节点都能随意发送篡改后的文件?" 百度网盘有自己的客户端,客户端里下载了数据之后和可信服务器上下发的 hash 值比对一下就好了

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

    再不行的话就分片下载校验……
    tool2d
        24
    tool2d  
       2022-10-19 17:01:06 +08:00
    @edis0n0 "搞下载器体验就比网盘还烂了。"

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

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

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

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

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

    @yuzo555
    @flynaj
    @janxin
    @ren2881971
    SunsetShimmer
        38
    SunsetShimmer  
       2022-10-19 23:50:59 +08:00
    @edis0n0

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

    那就像 Mega 网盘,在客户端网页下载好文件,然后校验,如果不过就不给用户?不清楚能不能实现。
    KagurazakaNyaa
        39
    KagurazakaNyaa  
       2022-10-19 23:51:02 +08:00
    @edis0n0 那你直接用 wasm 每个分片都验证 hash 不就好了,有硬件加速算 sha 和 md5 都是飞快的
    SunsetShimmer
        40
    SunsetShimmer  
       2022-10-19 23:51:42 +08:00
    @SunsetShimmer 因为提到 Mega 的方法不太行,那就只能让用户自己选择了...
    SunsetShimmer
        41
    SunsetShimmer  
       2022-10-19 23:56:41 +08:00
    @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  
       2022-10-20 00:11:19 +08:00
    某 pcdn 在某电视上的使用简化:在电视上运行 pcdn 的 sdk 并监听一个本机端口,电视把播放地址通过这个端口给星域的 sdk ,然后就可以接受视频了。
    百度的做法,我理解是在家宽做的这个 sdk ,或者你绕过本地的客户端下载就是无法验证篡改的,我觉得你把他们的安全想的太好了。。
    baobao1270
        43
    baobao1270  
       2022-10-20 07:29:24 +08:00
    比较好的做法:提供 HASH 或 GPG 签名,并教育用户验证 HASH
    最节约成本的做法:带密码的 ZIP 压缩包
    julyclyde
        44
    julyclyde  
       2022-10-20 09:02:02 +08:00
    按你这个“给客户分发视频……等大文件”的需求
    应该直接邮寄硬盘

    目前电影行业就是这么搞的,直接快递硬盘,里边存着加密的视频文件。电影院用 U 盾在线申请播放密钥来解密
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2993 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 12:35 PVG 20:35 LAX 04:35 JFK 07:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86