• 请不要在回答技术问题时复制粘贴 AI 生成的内容
edis0n0
V2EX  ›  程序员

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

  •  
  •   edis0n0 · Oct 19, 2022 · 4016 views
    This topic created in 1479 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
    7RTDKSAK
    Oct 19, 2022
    1
    参考发行版 ISO 分发?

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

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

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

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

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

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

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

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

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

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

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

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

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