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

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

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

    需求是给客户分发视频、压缩包等大文件,大家都知道国内网盘下载不是限速就是要注册、下客户端,直接这样分享太不专业了(知道某些企业网盘可以但不太想用,还是想完全可控,用自己域名),大厂对象存储流量又很贵,于是买了几个小商家的大带宽服务器搭 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
        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
        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 网盘,在客户端网页下载好文件,然后校验,如果不过就不给用户?不清楚能不能实现。
    XiLingHost
        39
    XiLingHost  
       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   ·   我们的愿景   ·   实用小工具   ·   3145 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:38 · PVG 20:38 · LAX 05:38 · JFK 08:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.