:::danger 文件哈希泄露的安全风险综述

这个问题我专门查了一轮中英文资料。先给结论:“文件哈希泄露是否有危害”这件事,答案不是简单的是或否,而是高度依赖上下文。

:::

如果哈希只是一个离线完整性校验值,比如 Linux 发行版官网公开发布的 SHA256SUMS,它通常不是秘密,反而应该公开并签名,方便用户校验下载完整性与来源真实性。Fedora 官方验证说明Debian 官方镜像校验说明Ubuntu 官方教程 都是这么设计的。

但如果系统把文件哈希当成内容身份、存在性探针、去重凭证、内容寻址地址、样本检索键,情况就完全不一样了。此时,泄露的哈希虽然字节很少,却可能成为调取、确认、关联乃至恢复大文件的入口。从工程安全角度看,它往往已经不是“无害摘要”,而是能力(capability)的一部分

我下面会分三层展开:一是国内网盘“秒传/离线下载”语境下的现实攻击面和历史;二是英文论文与官方文档里对 deduplication、proof-of-ownership、content addressing 的系统性讨论;三是对“哈希是否应与文件本体同等保密”这个命题,给出一个更严格的判断。

一、为什么这个问题值得重新讨论

很多人对哈希的第一反应是:它不可逆,所以泄露了也无所谓。这个判断只说对了一半。

密码学里,强哈希的确不等于可逆加密。单看一个 SHA-256 值,攻击者通常无法凭空还原任意大文件原文。这一点没有问题。

问题在于,现实系统并不是把哈希孤立地放在那里。平台会把它接入索引、去重、检索、分享、情报聚合、已知文件识别这些机制。一旦进入这些系统,哈希的角色就从“摘要”变成了“索引键”。

说得更直白一点:

  • 在纯密码学视角下,哈希像是“压缩后的指纹”。
  • 在真实工程系统里,它更像是“文件在某个生态里的身份证号 + 查询主键”。

这两者的安全含义完全不同。

二、国内网盘语境:哈希为什么会变成现实攻击面

1. “秒传”本质上就是用短标识跳过长传输

百度网盘企业版一篇介绍秒传技术的文章虽然标注了“AI 生成”,不能作为强证据使用,但它至少准确反映了行业公开叙事:上传文件时先计算哈希,再与云端已有文件比对;若一致,则跳过完整传输,直接建立对应关系。来源

更有价值的是司法与学术资料。关于百度网盘“食为奴”案的讨论中,公开材料已经把“秒传式离线下载”的核心说得比较清楚:平台先解析索引文件,识别待下载文件的 MD5,再与服务器已存文件比对,命中后建立映射关系,而不是重新传完整内容。司法文明协同创新中心文章最高人民法院知识产权法庭研讨摘登

这件事的关键不是某个产品细节,而是它揭示了一个很重要的安全结构:

短小的文件指纹,在某些系统设计里足以驱动大文件的可用性转移。

也就是说,哈希不是“描述文件”,而是在某些场景里“代表文件”。

2. 国内网盘治理史,说明这不是纸面上的理论问题

2015 年,国家版权局针对网盘服务版权秩序发文,要求网盘服务商对侵权作品采取删除、制止分享、保存用户信息等措施。中央网信办转载北京日报的解读时明确指出,当时百度网盘、360 网盘、金山网盘、腾讯微云、新浪微盘、迅雷快盘等平台已成为盗版音视频与文字作品传播的重要渠道。中央网信办转载解读

这背后的监管含义很明确:网盘早就不是“纯私有存储”,而是现实传播链的一环。

之后的历史节点也很能说明问题:

  • 2012 年,115 网盘因“政策隐患及版权争议”关闭大众分享功能,成为国内网盘治理的一次早期转折。央视网转引
  • 2016 年,360 云盘宣布停止个人云盘服务,公开理由直接包括非法文件、侵权盗版、淫秽色情信息传播等问题。新华网报道
  • 2019 年,优酷诉百度网盘案中,法院认定百度网盘在收到权利通知后未及时采取足够措施,放任大量侵权链接持续传播。公开报道提到涉案侵权链接规模超过 1.1 万条。德州中院转载案件报道

这些材料未必都直接讨论“哈希泄露”,但它们共同说明了一点:一旦平台具备“存储 + 索引 + 分享 + 转存/秒传”能力,哈希类标识就很容易进入大规模传播链。

3. 现实攻击面不只来自哈希本身,而来自“哈希 + 平台能力”

我认为,国内网盘语境里最值得关注的不是“哈希是否可逆”,而是以下几类工程攻击面:

攻击面 A:存在性确认

如果平台支持跨用户去重,知道一个文件的哈希,就可能变相确认平台内是否已有该文件。对热门影视、侵权资源、恶意样本来说,这种确认本身就有价值。

攻击面 B:索引命中后直接复用

如果平台允许依据哈希或等价指纹建立“映射”而不重新上传完整文件,那么泄露的哈希就可能成为内容调取入口。它不是原文,但它足以触发原文复用。

攻击面 C:外部传播链拼接

现实里的攻击往往不是单点完成,而是靠多个泄露面拼起来。公开分享链接、索引文件、文件大小、上传时间、标题、第三方盘搜、社群脚本、离线下载功能叠加后,哈希会从“技术字段”变成“传播中枢”。

2017 年关于第三方“盘搜”抓取公开网盘分享链接的报道,其实就是很典型的例子。问题不一定出在哈希一项,而是文件标识、链接和检索能力共同形成了信息外泄链。人民网报道

三、英文资料的核心结论:风险来自 dedup、PoW 和内容寻址

如果只看英文文献,这个问题其实已经讨论很多年了,而且结论相当一致:哈希泄露的风险核心,不是“哈希能否逆原文”,而是“系统是否把哈希当作文件存在、所有权或内容身份的证明”。

1. 去重把哈希变成“存在性探针”

Harnik、Pinkas、Shulman-Peleg 在《Side Channels in Cloud Services: Deduplication in Cloud Storage》中指出,跨用户 deduplication 天然形成 side channel。攻击者只要上传候选文件并观察是否发生去重,就能判断其他用户是否已经拥有该文件。论文 PDF

这个攻击非常关键,因为它击穿了一个常见误区:即使平台不直接公开文件内容,只要它把“是否重复”暴露出来,外部就已经获得了一种存在性 oracle。

论文里甚至给出了很现实的例子,比如利用 deduplication 判断某人是否持有某个敏感文件,或者对模板化文档中的少量未知字段做枚举。

2. “只知道哈希也可能拿到原文件”是经典设计缺陷

Halevi 等人的《Proofs of Ownership in Remote Storage Systems》更进一步,把问题说得非常直接:如果系统仅用文件哈希来判断客户端“拥有”某个文件,那么攻击者只要知道该文件的哈希,就可能骗过服务端,随后获得完整文件。IACR ePrint

这篇论文的价值很高,因为它不是泛泛而谈,而是明确把问题建模成:

  • 攻击者掌握极少 side information;
  • 服务端错误地把短值当作所有权证明;
  • 结果是攻击者获得任意大文件。

换句话说,这类系统里,哈希已经不是 metadata,而是 access primitive。

3. 去重友好的加密并不具备普通意义上的“强机密性”

Bellare、Keelveedhi、Ristenpart 在《Message-Locked Encryption and Secure Deduplication》中提出 MLE(message-locked encryption),本质上就是承认:如果系统既要求去重,又要求加密,那么安全模型就不能按普通随机加密去理解。IACR ePrint

后续的 DupLESS 工作则更明确指出,convergent encryption 之类设计容易遭受 dictionary/brute-force 攻击,尤其当消息来自低熵空间、已知语料或模板文件时,攻击者可以通过枚举候选内容来匹配目标文件。DupLESS 论文

这件事特别重要,因为它说明:

“哈希字节数很少”并不自动等于“攻击难度很大”。

真正决定攻击难度的,是目标文件的候选空间大小,以及攻击者能否把哈希接入一个“可验证猜测”的系统。

4. Learn-the-Remaining-Information:低熵字段枚举是真风险

Tahoe-LAFS 的官方文档长期讨论了一个著名问题:Learn-the-Remaining-Information attack。典型场景是,攻击者已知文档的大部分内容,只剩少量字段未知,比如工资、账号、余额或某个编号。此时,攻击者可以枚举剩余字段,生成候选文件,计算相应指纹,再和目标值比对,从而恢复秘密。Tahoe-LAFS 文档 PDF

这类攻击的启发意义很大:哈希并没有凭空“压缩出”高熵信息;真正发生的,是攻击者借助模板、上下文和候选空间,把一个看似高熵的大文件转化成了少量待枚举变量。

所以如果从信息论角度说,更准确的表达不是“低熵数据逆出了高熵数据”,而是:

系统暴露了一个非常强的判定接口,使得外部先验知识可以高效锁定原文。

5. 去重侧信道已经有远程实攻

2022 年 USENIX FAST 的 DUPEFS 论文展示了现代文件系统去重侧信道如何在真实系统中泄漏信息。作者在启用 dedup 的 ZFS 场景下,通过远程方法慢速泄漏了 OAuth token 等真实敏感数据。USENIX FAST 2022

虽然速率不高,但这足以说明一个事实:只要“重复状态”本身可被探测,哪怕看不到明文,也可能持续泄漏真实秘密。

6. 内容寻址系统里,哈希就是地址

更激进的场景是内容寻址系统。早期 CASPER 论文就指出,recipe/checksum 查询本身会泄漏用户请求内容,因为如果攻击者掌握常见块数据库,就可能反推出访问对象。CASPER 论文

IPFS 官方文档今天仍然强调,虽然节点间通信可加密,但 CID、PeerID、DHT provider metadata 等公开元数据会暴露谁在提供或请求某个内容标识。IPFS 官方文档

这里几乎不存在“哈希是不是文件”这个争论,因为在内容寻址系统里,哈希就是内容地址。严格说它并不等于文件本身,但也很难再把它视为单纯的无害摘要。

7. 在安全情报系统里,哈希早就是“样本主键”

VirusTotal 官方 API 文档明确说明,文件对象的 ID 就是其 SHA-256,并支持直接按哈希查询文件报告、元数据以及部分下载能力。VirusTotal Files API文件下载 API

MalwareBazaar 的官方 API 也允许按 sha256_hash 下载恶意样本压缩包。MalwareBazaar Community API

NIST NSRL 则长期把哈希作为 known file identification 的核心字段之一,用于法证识别和归档。NIST NSRL FAQ

这说明在现实世界里,哈希早就不是“只是完整性校验值”了。它已经是:

  • 情报平台的查询主键;
  • 样本库的定位键;
  • known-good / known-bad 生态中的识别器。

一旦某个私密文件的哈希进入这样的系统,即使原文件未公开,第三方也可能完成确认、语义归类、关联分析、来源富化

四、从红队视角看:新的攻击面往往藏在“优化目标”里

如果把这个问题放到红队方法论里,它的价值不只在于“哈希有没有风险”,更在于它提示了一种新的攻击面提取方式:

不要只盯着传统边界,不要只盯着显式接口,而要优先审视系统为了效率、成本和体验做了哪些优化。

网盘只是一个典型例子。对于大规模存储系统来说,去重几乎是一种天然冲动:

  • 重复文件很多;
  • 带宽和存储成本都很高;
  • 用户希望“秒传”;
  • 平台希望减少冗余副本;
  • 热门内容天然有跨用户复用价值。

因此,问题往往不是“系统会不会做去重”,而是“系统会通过什么机制做去重”。而一旦把问题改写成这个形式,红队的观察点就会立即变化。

1. 从功能表面转向成本结构

传统的攻击面分析,容易从“开放了什么 API”“有什么鉴权缺陷”“能否越权下载”开始。这种路径当然重要,但它容易忽视系统背后的成本约束。

红队如果换一个角度,从平台最想省掉什么成本来观察,常常能更快找到高价值面:

  • 想省带宽,就会出现客户端去重、断点跳传、离线拉取;
  • 想省存储,就会出现单实例存储、块级复用、硬链接或引用计数;
  • 想省 CPU,就可能减少强校验、改用分层校验、局部指纹或缓存命中;
  • 想提升体验,就会暴露“是否已存在”“是否秒传成功”“是否命中资源”等状态反馈。

而这些优化一旦成立,攻击面就不再只是“文件下载接口”,而会扩展成:

  • 是否存在去重命中 oracle;
  • 是否存在资源存在性反馈;
  • 是否把短指纹误当成所有权证明;
  • 是否允许通过索引值直接建立映射;
  • 是否泄露了块级或文件级的内容身份。

换句话说,新的红队思维并不是追着显式漏洞跑,而是沿着系统优化路径逆推:它为了更快、更省、更便宜,必然引入了哪些可观察、可伪造、可复用的信号。

2. 从“数据面”转向“控制面”

哈希类问题还有一个很容易被低估的点:攻击目标不一定是数据面本身,也可能是控制面。

在很多系统里,哈希并不直接等于文件内容,但它可以控制:

  • 是否上传;
  • 是否下载;
  • 是否建立引用;
  • 是否命中缓存;
  • 是否触发样本关联;
  • 是否获得已有对象的访问路径。

这意味着红队在建模时,需要把哈希看成一种控制信号。一旦控制信号可以被猜测、伪造、重放或外部查询,攻击面就出现了。

所以在网盘场景中,真正危险的不是“摘要被看见了”,而是:

摘要一旦进入控制面,就可能获得超出摘要本身的信息支配力。

3. 它更像缓存系统,而不只是哈希表

如果继续往下抽象,这类结构与其说像传统哈希表,不如说更像一种以内容身份驱动的缓存或对象复用系统

传统哈希表的直觉是:

  • key 只是查找辅助结构;
  • value 才是主要资产;
  • key 泄露通常不具有直接业务价值;
  • key 是否可被外部共享,往往不是系统成立的前提。

但去重、秒传、内容寻址这类系统并不是这样。

它们更接近缓存系统的原因在于:

  • 系统已经保存了一个高成本对象;
  • 目标是尽量复用已有对象,而不是重复生成或重复传输;
  • 一个较小的身份标识被用来命中一个较大的对象;
  • 一旦命中成功,后续动作往往不是“返回索引信息”,而是直接跳过上传、建立引用、返回对象或触发复制。

从这个角度看,本文讨论的“哈希”其实更像一种 content-derived cache key。它并不是为了实现通用键值映射,而是为了在大规模对象复用场景下,用较小代价命中已经存在的大对象。

这也解释了为什么它会呈现出一种典型的“以小博大”结构:

  • 小的是 key、tag、摘要、指纹;
  • 大的是被索引、被复用、被调取的真实对象;
  • 危险之处不在于小对象本身,而在于它能否稳定命中大对象。

这与普通应用里的 cache key 又有一个关键差别:普通 cache key 往往是内部实现细节,而这里的 key 往往来自可共享、可计算、可传播的 message 本身。

4. Message 可共享,决定了这类 key 天生更容易外溢

常规工程讨论缓存安全时,默认前提往往是 cache key 属于内部命名空间。例如:

  • 用户 ID + 参数拼接;
  • SQL 模板 + 查询条件;
  • 内部路径、租户 ID、函数参数;
  • 只有服务端知道的派生键。

这类 key 的典型特点是:外部不容易完整构造,也不适合被公开传播。

但 message-locked / content-derived 系统恰好反过来。

它们的 key 往往直接或间接来自 message:

  • 文件内容本身;
  • 文件内容的哈希;
  • 文件切块后的指纹;
  • 由 message 派生出的 tag、CID、ETag 或等价对象身份。

而 message 本身在现实中恰恰经常是可共享的:

  • 一份热门安装包会被反复下载;
  • 一份公开 PDF 会被多人持有;
  • 一份恶意样本会在情报社区中流转;
  • 一份盗版影视资源会在社群中不断转发;
  • 一份模板化文档会被大量用户基于相同模板生成。

这意味着“计算并分享哈希”不是边缘行为,而是非常自然的协同行为。也正因为如此,这类系统面临的不是“key 会不会偶然泄露”,而是:

key 在很多场景下本来就会被计算、转发、比较和讨论。

一旦系统设计仍然假设“只要不公开原文件,公开 key 也没关系”,风险就会被系统性低估。

因此,从防守角度看,一个更准确的判断是:

当 key 来源于 message,且 message 本身具有可共享性时,就不应再沿用传统内部缓存键的安全直觉。

真正应该假设的是:

  • 攻击者可能自己算出 key;
  • 攻击者可能从第三方拿到 key;
  • key 可能出现在日志、论坛、情报平台、脚本和自动化工具里;
  • key 泄露不是异常,而是系统工作方式的一部分外溢。

5. 可迁移的方法:从网盘扩展到其他系统

这种方法并不局限于网盘。

凡是存在以下目标的系统,都值得用同样的红队思路检查:

  • 内容分发网络的缓存命中优化;
  • 容器镜像仓库的层复用;
  • 备份系统的块级去重;
  • 数据湖和对象存储的单实例归档;
  • 恶意样本平台的 known-file 查询;
  • 内容寻址网络的 CID/DHT 检索。

这些系统表面上解决的是性能或成本问题,底层却常常引入同一类安全张力:

为了识别“是否是同一个对象”,系统必须暴露某种稳定身份;而一旦稳定身份可被外部利用,它就可能从优化元数据变成攻击入口。

因此,从红队视角看,这篇文章真正想指出的新思路是:

攻击面并不总是来自功能扩张,也可能来自优化收敛。系统越想把“相同内容”识别得更准、更快、更便宜,就越可能把内容身份外溢成安全问题。

五、从信息论角度看:这一判断有现实基础,但表述需要更精确

一种很有代表性的判断是:哈希值很短,却能“四两拨千斤”地指向数 GB 的原文件,这看上去像是低熵数据恢复高熵数据。

我认为这一直觉是工程上成立、信息论上需要修正

1. 为什么说它“工程上成立”

如果平台把哈希接入以下能力:

  • 去重命中;
  • 所有权验证不严;
  • 内容寻址;
  • 已知样本检索;
  • 恶意样本下载;
  • 公开分享/索引映射;

那么一个 32 字节的 SHA-256 确实可以触发一个数 GB 文件的发现、复用或下载。这在工程后果上就是“四两拨千斤”。

2. 为什么说它“信息论上不能简单说成逆向”

因为哈希本身并没有创造信息,也没有违反熵守恒。真正让恢复成为可能的,是外部世界已经提供了额外信息

  • 攻击者知道候选文件来自某个有限集合;
  • 攻击者掌握模板,只有少量字段未知;
  • 平台已经保存了该文件副本;
  • 第三方情报库已经索引了该文件;
  • 系统把哈希当成检索键或能力令牌。

所以更严格的说法应该是:

文件哈希泄露的危险,不在于它单独蕴含了原文件的全部信息,而在于它能与外部语料库、索引系统和验证 oracle 组合,极大降低恢复或确认原文件的成本。

这和“密码学单向性”并不矛盾。

六、那么,文件哈希是否应与文件本体同等保密

这是我这轮调研里最想认真回答的地方。

我的结论是:

把“文件哈希永远应与文件本体同等保密”当成绝对命题,太强。

但把它改成下面这句话,我认为是站得住的:

当文件哈希被系统用于内容身份、去重、存在性确认、内容寻址、样本检索或访问映射时,它的敏感级别应按“高风险元数据”甚至“准访问凭证”处理,而不能再按普通摘要处理。

换句话说,要分场景:

场景 A:哈希通常不需要保密

  • 官方软件发布页公开的校验和;
  • 已经面向公众分发的 ISO、安装包、开源源码 tarball;
  • 用于完整性校验且无额外检索能力绑定的公开文件。

这些场景里,哈希公开反而是好事,前提是要配合签名体系,防止“文件和哈希一起被篡改”。这也是 Fedora、Debian、Ubuntu 官方文档都反复强调的做法。FedoraDebianUbuntu

场景 B:哈希应被视为敏感元数据

  • 私密文档、合同、工资单、病例、证据材料;
  • 模板化强、候选空间小的文件;
  • 会被去重系统、情报系统、样本库、内容寻址网络消费的文件;
  • 哈希一旦泄露就可能触发存在性确认或命中下载的系统。

这些场景里,哈希虽然不是文件本身,但它对攻击者的价值已经足够高。

场景 C:哈希几乎等价于能力令牌

  • 平台允许“知道哈希即可转存/提取/下载”;
  • 恶意样本平台允许按 hash 直接下载样本;
  • 内容寻址网络直接以 hash/CID 作为内容地址;
  • 系统内部把 hash 当成 access key 使用。

这种场景下,“哈希的机密性应接近文件本身”这一说法就非常接近事实。因为此时泄露的已经不只是摘要,而是访问路径的一部分

七、既要去重,又要安全:可以落地的工程方案是什么

既然去重几乎是大规模存储系统的天然需求,那么真正有价值的问题就不是“禁用去重”,而是“如何在保留去重收益的同时,避免把去重能力变成攻击面”。

现有论文和工程经验大致指向以下几类可组合方案。

1. 不要把短指纹当作所有权证明

这是最基本的一条,也是 PoW 论文提出的核心原因。

如果系统只凭文件哈希、块哈希或某个静态 tag 就认定客户端“拥有”数据,那么本质上就是把摘要误用成了凭证。更稳妥的做法是引入 Proof of Ownership,要求客户端证明自己确实持有文件内容本身,而不是只知道一个短值。Halevi et al.

工程上,这意味着:

  • 不允许“知道哈希即秒传成功”;
  • 不允许“知道对象 ID 即加入引用”;
  • 去重命中后仍要做内容持有证明;
  • 映射建立前至少抽样校验若干不可预测的数据块。

这条原则会增加一些时延,但它直接阻断了“只靠 side information 领取大文件”的路径。

2. 减少去重状态的可观察性

大量攻击并不是因为系统允许直接下载,而是因为系统把“命中/未命中”这个状态暴露得太明显。

因此,第二条原则是:即使内部做去重,也不要轻易把去重状态反馈给外部。

可行办法包括:

  • 把 deduplication 放在服务端完成,而不是客户端先问一遍再决定是否上传;
  • 对外统一上传流程,避免从网络流量、耗时或响应语义中直接看出是否命中;
  • 对小文件、模板文件、高敏文件禁用跨用户去重;
  • 对高风险命中结果引入随机化、延迟或额外校验,降低存在性 oracle 的可利用度。

Harnik 等人提出的随机阈值思路,本质上就是在削弱“命中状态”和“文件已存在”之间的强对应关系。论文 PDF

3. 做分层去重,而不是全局去重

从安全角度看,最危险的通常不是“去重”本身,而是跨租户、跨用户、跨安全域的全局去重

因此,一个非常实用的折中方案是分层处理:

  • 单用户域内允许去重;
  • 同一企业租户内可选去重;
  • 跨租户默认不做去重;
  • 对公开已知的大文件与私密文件采用不同策略。

这样做的代价是牺牲一部分全局存储收益,但能大幅降低确认攻击、横向推断和敏感内容身份外泄的风险。

很多所谓“零知识云盘”不做跨账户 dedup,本质上就是在拿存储效率换隐私边界。

4. 对高风险文件类型禁用“稳定身份”

并不是所有文件都值得用同一套 dedup 策略处理。

对于以下类型,更适合直接禁用跨用户稳定身份:

  • 合同、工资单、票据、病历等模板化私密文档;
  • 高价值取证材料;
  • 敏感配置、密钥包、证书归档;
  • 已知处于攻击者候选空间内的标准格式文件。

因为这些文件最容易遭受 LRI、confirmation attack 或 known-file 关联攻击。对它们继续追求极致 dedup,安全收益通常不划算。

5. 让“内容身份”只在受控域内有效

如果系统必须依赖内容身份来做索引,那么更稳妥的做法不是把它彻底公开,而是让它只在受控域内成立。

这意味着:

  • 外部接口不直接暴露原始内容哈希;
  • 内部索引可使用加盐 tag、租户域绑定 tag 或受控转换后的标识;
  • 对外下载、分享、转存不允许直接以原始 hash 作为能力键;
  • 内容寻址层与访问控制层分离,避免“知道 ID”自然推出“有权访问”。

这类思路与 MLE / DupLESS 背后的基本方向一致:既承认 dedup 的经济价值,又尽量避免把公开可算的内容身份直接暴露成攻击入口。MLEDupLESS

6. 把风控重点从“文件内容”前移到“身份信号”

很多平台的治理动作都集中在事后删文件、断链接、封账号。但从防守视角看,更早的一层其实是:

哪些稳定身份信号一旦外泄,就可能被复用来扩散内容。

因此,安全设计应把以下对象纳入风控范围:

  • 文件级和块级哈希;
  • 索引文件;
  • 秒传码、离线下载码、内容地址;
  • 分享链接与可被第三方抓取的公开元数据;
  • 可公开查询的对象 ID。

只有把这些“身份信号”当成资产管理,平台才不会在前门强化审核、后门却把内容身份作为低成本能力暴露出去。

7. 最现实的工程结论:接受 trade-off,不追求幻想中的“零代价安全去重”

这一类问题最后都会回到同一个现实:去重效率、用户体验与隐私边界之间没有零成本三角平衡。

如果目标是:

  • 最大化跨用户去重;
  • 最大化秒传成功率;
  • 最小化上传成本;
  • 同时完全隐藏文件存在性、所有权和内容身份;

那么通常做不到。

真正成熟的方案不是试图否认 trade-off,而是清楚划分:

  • 哪些数据值得全局去重;
  • 哪些数据只能域内去重;
  • 哪些数据宁可多存几份,也不能暴露稳定身份;
  • 哪些场景必须用 PoW、随机化或统一上传流程来抵消侧信道。

从防守角度看,这比简单宣称“哈希不可逆,所以没风险”要诚实得多,也有效得多。

八、对“秒传被黑产滥用,所以功能被叫停”的判断

一个常见判断是,国内许多平台曾提供“秒传”,后来因黑产常滥用传播恶意或侵权文件而叫停。

结合这轮资料,我认为可以下一个比较稳妥的结论:

  1. “网盘的分享、转存、离线下载、秒传等能力长期被用于侵权传播”,这一点有充分公开证据支持。
  2. “国内平台近十多年持续受到版权和内容治理压力”,这一点也有监管文件、媒体报道和判例支持。
  3. “部分平台确实缩减、关闭或收紧了相关能力”,这一点也能找到历史节点,比如 115 和 360。
  4. 但如果要非常严格地说:“百度网盘、夸克网盘明确因为哈希秒传被黑产滥用而官方下线该功能”,我目前没有找到足够强的官方公开表述来支撑这么精确的因果链。

所以写报告时,最好把话说成:

国内网盘的哈希驱动型快速传输与分享能力,长期嵌在侵权传播和灰黑产利用的治理语境里,平台对这些能力的收紧,至少与版权、违规内容传播和风控压力高度相关。

这样更稳。

九、对象存储的 impact scope:主流 S3/OSS 与开源社区是否存在类似 oracle

如果把讨论进一步扩展到对象存储,结论会比网盘语境更细一些。

1. 主流对象存储默认不是“内容指纹驱动型”产品

无论是 Amazon S3 还是阿里云 OSS,公开文档都把对象标识建立在 bucket + object key 上,而不是建立在内容哈希上。OSS 文档明确写到,每个对象由其 object key 在 bucket 内唯一标识。OSS 概览

S3 的官方博客也反过来说明了同一个事实:在 S3 里,重复对象是允许存在的,官方给出的“识别重复对象”方案是事后用 Inventory + Athena + ETag 做分析和清理,而不是由 S3 在对象 API 层自动把相同内容折叠成一个共享对象。AWS Storage Blog

这意味着,从默认语义上看,S3/OSS 并不像网盘“秒传”那样把“内容哈希命中”直接暴露成一个用户可感知的主路径。至少在公开 API 这一层,它们默认是:

  • 键名寻址,不是内容寻址;
  • 对象存在性以 key 为中心,不是以内容哈希为中心;
  • 完整性校验值用于校验和并发控制,不是默认用于跨用户内容复用。

这会直接改变风险强度。

2. 但它们确实存在较弱的 oracle:键名存在性与 ETag 条件请求

虽然默认没有“哈希秒传”式强 oracle,但主流对象存储普遍支持条件请求。

Amazon S3 官方文档明确说明:

  • If-None-Match 可在写入时检查指定 key 是否已存在;
  • If-Match 可在写入时用 ETag 检查对象当前状态;
  • 使用这些条件写入,需要相应权限,而这些能力本身“enables the caller to check” 对象存在性或 ETag 状态。S3 conditional writes

阿里云 OSS 也提供基于 ETag 和修改时间的条件下载,请求不满足时返回 304 Not Modified412 Precondition Failed,而不是返回对象体。OSS conditional download

从红队角度看,这代表对象存储虽然没有默认暴露“内容去重 oracle”,但依然存在两类较弱 oracle:

  • key existence oracle:知道 bucket 和 key,并拥有相应写权限时,可通过 If-None-Match 判断 key 是否存在;
  • ETag state oracle:知道对象 ETag 且拥有相应读写权限时,可通过条件请求判断对象版本状态。

不过,这类 oracle 与网盘秒传的风险强度不同,差别在于:

  • 它们通常要求明确的对象路径,而不是只凭内容指纹;
  • 它们通常要求已有授权,而不是把内容身份直接变成跨用户共享入口;
  • 它们主要暴露的是key 级或对象状态级信息,不是全局内容存在性。

因此,如果要严格类比,这更像“对象状态 oracle”,而不是“内容身份 oracle”。

3. ETag 不是稳定内容身份,反而削弱了“哈希即能力”的风险

S3 官方文档还特别强调了一点:对象校验值和 ETag 的关系并不总是稳定。

  • S3 现在支持多种 checksum 算法;
  • multipart upload 场景下,对象 ETag 不是整个对象内容的 MD5;
  • 很多场景下应把 ETag 理解成实现相关的对象标识,而不是稳定、可移植的内容哈希。S3 object integrity

AWS 官方博客在讨论重复对象识别时也明确指出,基于 ETag 做 dedup 只适用于一部分对象,对 multipart、SSE-KMS、SSE-C 等场景并不成立。AWS Storage Blog

这点很关键。它意味着主流对象存储虽然暴露了 ETag,但并没有把 ETag 设计成一个强、稳定、全局统一的内容身份。这实际上在一定程度上削弱了“知道一个摘要即可在全局复用内容”的风险。

4. 对象存储真正危险的模式,通常出现在“外围系统”而不是核心对象 API

如果只看 S3/OSS 核心对象 API,风险更偏向:

  • key 暴露;
  • 预签名 URL 暴露;
  • bucket 策略误配;
  • 条件请求被用作存在性探针;
  • ETag 或元数据被上层应用误当成稳定身份。

而更接近网盘“秒传 oracle”的危险模式,通常出现在外围系统中,例如:

  • 网关层自行实现跨用户去重;
  • 备份/归档系统在对象存储之上做单实例复用;
  • 上层业务以内容哈希作为对象名;
  • 样本平台把对象哈希同时当作索引键与下载键;
  • 应用层围绕对象存储构建“秒传码”“离线转存码”“资源指纹码”。

换句话说,S3/OSS 本身通常不是最强的 oracle 来源,但它们经常成为这类 oracle 的承载底座。

5. 开源社区的情况:风险存在,但分布不均

如果把范围扩展到常见开源对象存储,可以看到三种不同层次的情况。

5.1 MinIO:默认是 S3 兼容对象存储,不是内容去重型系统

MinIO 当前最需要确认的不是“是否有 dedup oracle”,而是其维护状态。

截至 2026 年 2 月 13 日,MinIO 官方 GitHub 仓库已经被归档为只读;README 直接写明:“THIS REPOSITORY IS NO LONGER MAINTAINED.” 同时又说明社区版改为 source-only distribution,不再提供预编译二进制更新。GitHub 仓库 README归档后的 issue 页面

这意味着一个非常具体的影响范围判断:

  • MinIO 社区版仍然可用,但维护风险已经显著上升
  • 风险不在于它天然存在“哈希秒传”式强 oracle;
  • 风险在于它保留了 S3 兼容语义,而社区版项目本身又进入了不再维护的状态。

从 API 语义看,MinIO/AIStor 文档明确支持 If-MatchIf-None-Match 等条件操作,这与 S3 模型一致。MinIO S3 API Compatibility

因此,对 MinIO 更准确的说法是:

它默认继承的是 S3 类对象状态 oracle,而不是网盘式内容去重 oracle;但由于社区版停止维护,任何围绕这些语义构建的上层系统都需要重新评估补丁与暴露面风险。

5.2 Ceph RGW:标准条件请求默认存在,真正危险的 dedup 是显式功能

Ceph RGW 的 S3/Swift 文档都支持基于 ETag 的条件 GET/HEAD/COPY,这是标准对象存储语义的一部分。Ceph S3 object opsCeph Swift object ops

但更值得注意的是,Ceph 官方文档确实存在 Full RGW Object Deduplication。该文档写得非常直接:

  • 这是一个 dedup 功能;
  • radosgw-admin dedup exec 执行;
  • 文档明确警告:“This command can lead to data loss and should not be used on production data!!” Ceph dedup docs

这说明在开源社区里,类似风险并不是不存在,只是往往不是默认产品语义,而是:

  • 明确的后台管理功能;
  • 需要管理员主动启用;
  • 风险已被官方文档直接标注。

因此,Ceph 的 impact scope 可以概括为:

  • 默认对象 API:主要是 key/ETag 级 oracle;
  • 可选 dedup 功能:存在更强的内容复用风险,但不是默认面,且官方已明确提示不适合生产。

5.3 OpenStack Swift:有条件请求,但在加密设计上主动做了泄漏缓解

Swift 同样支持 If[-None]-Match 这类条件语义,但它在对象加密文档里专门讨论了一个关键问题:

对象加密后,如果直接拿明文 ETag 去做条件比较,会泄露不必要的信息。为此,Swift 的加密中间件不会直接暴露明文 ETag,而是存储并比较 HMAC(object_key, ETag),从而让后端可以完成条件判断,同时避免直接泄露 ETag 或对象体相关信息。Swift object encryption

这是一个非常值得放进正文的例子,因为它说明:

开源社区并不只是“也有风险”,还已经给出了一类相对成熟的缓解设计:保留条件请求能力,但不把稳定内容身份原样暴露出去。

6. 对 impact scope 的最终判断

综合主流云对象存储与开源社区资料,可以把影响范围分成三层。

第一层:默认对象存储语义

典型代表:Amazon S3、阿里云 OSS、MinIO、Ceph RGW、OpenStack Swift。

这类系统默认大多是:

  • key-addressed;
  • 支持 ETag/条件请求;
  • 不默认以内容哈希做跨用户复用;
  • 因而默认暴露的是对象状态 oracle,不是最强的内容去重 oracle

第二层:可选去重或后台优化功能

典型代表:Ceph RGW dedup、备份归档系统、对象存储之上的单实例层。

这类系统开始接近本文讨论的核心风险,因为它们会把“内容相同”转化为内部复用,且如果外部能观察到命中状态,风险就会迅速增强。

第三层:上层业务把内容身份直接产品化

典型代表:网盘秒传、样本平台按 hash 下载、内容寻址网络、应用层自定义“资源指纹码”。

这一层才是最接近“知道一个短指纹,就能调取或确认大对象”的强 oracle 模式,也是本文最关注的高风险区。

因此,如果要给出一句清楚的 impact scope 判断,可以写成:

主流对象存储默认并不普遍暴露网盘秒传那种强内容 oracle,但普遍存在 key/ETag 级条件请求语义;真正高风险的模式,更多出现在对象存储之上的 dedup、网关、备份、样本检索和应用层内容身份系统中。

十、最终结论

我这次调研后的总判断可以压缩成三句话。

第一,文件哈希泄露是否有害,不能只看“哈希是否可逆”,要看系统是否把它当成内容身份或访问入口。

第二,从现实攻击面看,哈希最危险的作用不是“还原原文”,而是“确认存在、缩小候选空间、命中索引、触发映射、关联情报”。

第三,因此“文件哈希的机密性等同于文件本体”不是普适真理,但在 deduplication、秒传、内容寻址、样本检索、模板化私密文件这些场景里,这个判断非常接近现实。

如果要把这篇综述浓缩成一句话,我会这样写:

哈希不是文件本身,但当系统把哈希当成文件的可验证代表时,泄露哈希就可能等于泄露了通往文件的钥匙。

参考资料

中文资料

  1. 中央网信办转载《知识产权监管封堵“真空区” 云盘不能随意分享美剧了》
    https://www.cac.gov.cn/2015-10/26/c_1116934785.htm
  2. 最高人民法院知识产权法庭:《探讨行为定性 辨析规则适用——“新质生产力下网络平台侵权风险防范及法律责任”研讨会发言摘登》
    https://ipc.court.gov.cn/zh-cn/news/view-3592.html
  3. 司法文明协同创新中心:《秒传式离线下载的技术逻辑与法律定性》
    https://www.cicjc.com.cn/info/1041/16442.htm
  4. 德州市中级人民法院转载:《用户通过网盘疯传热播剧,优酷告百度一审获赔100万》
    https://www.sdcourt.gov.cn/dzzy/392143/392145/5818823/index.html
  5. 央视网转引:115 网盘关闭大众分享
    https://news.cntv.cn/20120807/118674.shtml
  6. 新华网:360 云盘停止个人云盘服务相关报道
    https://www.xinhuanet.com/zgjx/2016-10/21/c_135770840.htm
  7. 百度网盘企业版文章《秒传技术:私有化网盘的速度基因解析》
    https://eyun.baidu.com/content/522730/
  8. 人民网:盘搜抓取百度网盘公开分享链接相关报道
    https://it.people.com.cn/GB/n1/2017/0722/c1009-29422086.html
  9. 阿里云 OSS 条件下载
    https://www.alibabacloud.com/help/en/oss/user-guide/conditional-download
  10. 阿里云 OSS 概览
    https://www.alibabacloud.com/help/en/oss/user-guide/oss-overview

英文资料

  1. Harnik, Pinkas, Shulman-Peleg, Side Channels in Cloud Services: Deduplication in Cloud Storage
    https://www.pinkas.net/PAPERS/hps.pdf
  2. Halevi et al., Proofs of Ownership in Remote Storage Systems
    https://eprint.iacr.org/2011/207
  3. Bellare, Keelveedhi, Ristenpart, Message-Locked Encryption and Secure Deduplication
    https://eprint.iacr.org/2012/631
  4. Bellare, Keelveedhi, Ristenpart, DupLESS
    https://eprint.iacr.org/2013/429.pdf
  5. Tahoe-LAFS Documentation
    https://tahoe-lafs.readthedocs.io/_/downloads/en/tahoe-lafs-1.14.0/pdf/
  6. Bacs et al., DUPEFS: Leaking Data Over the Network With Filesystem Deduplication Side Channels
    https://www.usenix.org/conference/fast22/presentation/bacs
  7. Tolia et al., Opportunistic Use of Content Addressable Storage for Distributed File Systems
    https://www.usenix.org/event/usenix03/tech/full_papers/tolia/tolia_html/usenix03.html
  8. IPFS Docs, Privacy and encryption
    https://docs.ipfs.tech/concepts/privacy-and-encryption/
  9. VirusTotal Docs, Files
    https://docs.virustotal.com/reference/files
  10. VirusTotal Docs, Download a file
    https://docs.virustotal.com/reference/files-download
  11. MalwareBazaar Community API
    https://bazaar.abuse.ch/hunting/yara/remsec_encrypted_api/
  12. NIST NSRL FAQ
    https://www.nist.gov/itl/ssd/software-quality-group/national-software-reference-library-nsrl/about-nsrl/nsrl-frequently-0
  13. Fedora Project, download verification
    https://fedoraproject.org/en/security/
  14. Debian, verifying authenticity of images
    https://www.debian.org/CD/verify.en.html
  15. Ubuntu, how to verify your download
    https://ubuntu.com/tutorials/how-to-verify-ubuntu
  16. Amazon S3 conditional writes
    https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-writes.html
  17. Amazon S3 object integrity
    https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
  18. AWS Storage Blog, managing duplicate objects in Amazon S3
    https://aws.amazon.com/blogs/storage/managing-duplicate-objects-in-amazon-s3/
  19. MinIO GitHub repository
    https://github.com/minio/minio
  20. Ceph RGW S3 object operations
    https://docs.ceph.com/en/latest/radosgw/s3/objectops/
  21. Ceph RGW full object deduplication
    https://docs.ceph.com/en/latest/radosgw/s3_objects_dedup/
  22. OpenStack Swift object encryption
    https://docs.openstack.org/swift/2.11.0/overview_encryption.html
  23. MinIO S3 API Compatibility
    https://docs.min.io/enterprise/aistor-object-store/developers/s3-api-compatibility/