Snapdrop 安全与隐私完整分析:为什么不用数据库、文件如何端到端加密传输
【免费下载链接】snapdropA Progressive Web App for local file sharing项目地址: https://gitcode.com/gh_mirrors/sn/snapdrop
Snapdrop 是一款开源的本地文件共享工具(Progressive Web App),灵感来自 Apple AirDrop,让你在同一局域网内通过浏览器即可互传文件。它的核心安全设计可以概括为一句话:服务器只做"传话的",从不碰你的文件——没有数据库、不存储任何文件,并借助 WebRTC 对传输内容加密。本文将从源码层面拆解 Snapdrop 的安全架构,帮你搞懂它为什么敢于宣称"零文件留存"。
Snapdrop 是什么?架构速览
Snapdrop 的工作方式非常简单:
- 手机和电脑访问同一个网址(部署在你自己的内网或公网服务器上)
- 两台设备在对方页面中出现"气泡"
- 点一下气泡,选择文件,文件就直接从一台设备传到另一台
整个系统只有两部分:
- 浏览器前端:纯 HTML5/ES6 实现,位于 client/ 目录
- NodeJS 后端:只有 server/index.js 一个文件,负责 WebSocket 信令转发
官方对隐私问题的回答也值得一读,见 docs/faq.md 中的"What about privacy?"章节。
为什么不用数据库?
这是 Snapdrop 安全模型中最漂亮的一笔:整个服务端没有引用任何数据库。
打开 server/index.js 可以看到,SnapdropServer在构造函数中只创建了一个 WebSocket 服务器和一个内存对象:
this._rooms = {};this._rooms就是全部"状态"——一个按 IP 地址分组的房间字典,纯内存、不落盘。它的作用只是:
- 记录"哪些设备在同一个网络里"(server/index.js 中的
_joinRoom方法) - 当有新设备加入时,通知其他设备(
peer-joined消息)
这意味着:
✅服务器无法保存你的文件——因为它连写文件的代码都没有 ✅进程一停,所有信息即刻消失——没有历史、没有缓存、没有日志文件 ✅攻击面极小——没有 SQL 注入、没有凭据泄露、没有备份文件
作为对比,很多网盘/传输类工具需要数据库存储用户账号、文件索引和上传记录,而 Snapdrop 的"无状态"设计从根上消除了"文件被留存"的可能。
文件如何端到端加密传输?
正常模式:WebRTC 直连(P2P)
只要两台设备的浏览器支持 WebRTC(目前 Chrome、Edge、Safari、Firefox 都支持),文件就完全绕开服务器,在设备之间直接传输。
核心代码在 client/scripts/network.js 中:
RTCPeer类(network.js)负责建立 WebRTC 连接- 通过
createDataChannel创建可靠的数据通道(network.js) - 文件被
FileChunker切分为 64KB 的小块,经数据通道逐块发送(network.js)
加密发生在哪一层?WebRTC 数据通道在底层使用DTLS-SRTP 协议,连接建立时两台设备会自动完成密钥协商——这就是端到端加密的来源。传输途中的每一个字节都是密文,任何中间节点(包括服务器)即使抓到数据也只是一堆乱码。
服务器在这里的角色仅仅是信令服务器(Signaling Server):转发 SDP Offer/Answer 和 ICE 候选,帮助两台设备"找到彼此"。信令内容只包含连接协商元数据,不含任何文件内容。这一机制在 docs/faq.md 中有明确说明:"it is only used to establish a connection and is not involved in the file transfer"。
降级模式:WebSocket 中继
如果某台设备不支持 WebRTC(老浏览器),系统会降级为WSPeer模式(network.js):文件分块经服务器 WebSocket 中继转发。此时服务端在技术上"能接触到"数据流,所以自建部署时务必启用 HTTPS/WSS(下面会讲)。
服务器能看到什么?看不到什么?
| 数据 | WebRTC 直连模式 | 降级中继模式 |
|---|---|---|
| 你的 IP 地址 | 可见(用于分组) | 可见 |
| 设备型号/系统/浏览器 | 可见(来自 User-Agent) | 可见 |
| 在线状态、设备数 | 可见 | 可见 |
| 传输的文件名/大小 | ❌ 看不到 | 可见 |
| 文件内容 | ❌完全看不到(端到端加密) | 可见 |
| 留存任何文件 | ❌ 永不存储 | ❌ 永不存储 |
即使最保守地评估(降级模式),Snapdrop 依然做到了传输即结束:文件只流经内存,从不写入磁盘。
自建部署的安全细节
如果你想把 Snapdrop 部署在自己家里或公司内网(Docker 一键完成,参考 docs/local-dev.md 和 docker-compose.yml),有几个安全要点:
- TLS 证书自动生成:docker/openssl/create.sh 会在容器启动时用自签 CA 生成证书,让 WSS/PWA 功能正常工作
- 反向代理配置:docker/nginx/default.conf 将
/server路径代理到 Node 服务,并正确转发X-Forwarded-For头 - 设备隔离靠 IP 分组:服务器按 IP 划分"房间"(server/index.js),同一网络外的用户互相看不到
部署时需注意:代理必须设置X-Forwarded-For头,否则经代理访问的所有客户端会被分进同一个房间而互相可见——这一点在 docs/local-dev.md 的 Deployment Notes 中有专门提醒。
小结:Snapdrop 的隐私设计哲学
🔒无数据库:全部状态在内存中,进程即销毁 🔒P2P 优先:文件经 WebRTC 数据通道端到端加密直连,服务器仅做信令 🔒无账号体系:不收集任何个人信息,无注册、无登录 🔒开源可审计:整个服务端不足 300 行代码(server/index.js),任何人都能轻松读完并验证
对于"如何在同一局域网内安全地传文件"这个单一场景,Snapdrop 用"做减法"的方式给出了教科书级的答案:功能越少,需要信任的组件就越少,隐私风险也就越低。
【免费下载链接】snapdropA Progressive Web App for local file sharing项目地址: https://gitcode.com/gh_mirrors/sn/snapdrop
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考