English | 汉语
Xdrop 是一个开源加密文件传输应用,默认适用于浏览器,也支持智能体驱动的终端工作流,并确保服务端拿不到明文文件名、文件内容和密钥。 ## 亮点 - 在浏览器中完成端到端加密后再上传。 - 支持单文件和文件夹传输,接收文件夹时也可在本地重新打包为 ZIP 下载。 - 上传中断后可依赖浏览器本地状态继续断点续传。 - 支持到期失效链接、发送方管理,以及上传后的可选隐私模式。 - 后端支持兼容 S3 的对象存储,并使用 PostgreSQL 和 Redis。 ## 通过智能体使用 你也可以把 Xdrop 作为智能体技能来用,安装存储库自带的 skill: ```bash npx skills add https://github.com/xixu-me/xdrop/tree/main/skills/xdrop ``` 安装后,智能体可以直接在终端中使用 Xdrop 来: - 上传本地文件或目录,并返回加密分享链接。 - 接收完整的 Xdrop 分享链接(包含 `#k=...`)后,在本地下载并解密文件。 - 把文件交接流程自动化,而不用每次都切换到浏览器界面操作。 适合的场景包括: - 在云服务器上让智能体把构建产物、日志或备份上传到你的 Xdrop 实例,并返回一个临时链接给你。 - 在远程开发容器或类似 CI 的环境里,让智能体把某个目录打包后通过 Xdrop 传出来,而不是临时配置 SCP 或公开对象存储权限。 - 在本地机器上直接把完整的 Xdrop 链接交给智能体,让它下载到指定目录并完成解密。 示例指令: - `把 ./dist 上传到 https://xdrop.example.com,并给我一个 1 小时有效的 Xdrop 链接。` - `在这台云服务器上把 /var/log/myapp 通过 Xdrop 发出来,我要在本地排查。` - `把这个 Xdrop 链接下载到 ~/downloads,并保留原始目录结构。` ## 工作原理 1. 发送方在浏览器中创建一次传输。Xdrop 会生成随机的传输根密钥和独立的链接密钥,可选地移除图片中可删除的元数据,并在上传开始前准备好可恢复的本地状态。 2. API 创建传输记录,并返回管理令牌和上传限制。浏览器先注册加密后的文件元数据,再分批请求分块上传所需的预签名 URL。PostgreSQL 保存传输、文件和分块元数据,Redis 负责限流,兼容 S3 的对象存储只保存密文对象。 3. 发送方分享完整链接,例如 `/t/:transferId#k=...`。其中 `#k=...` 片段只保留在浏览器端,用于在本地解开传输根密钥。 4. 上传过程中,文件分块会在独立的 Web Worker 中加密并流式写入存储。每上传完一个分块,浏览器都会加密清单文件、上传清单,并在最后使用封装后的根密钥完成传输。 5. 接收方打开链接后,会获取加密清单和分块 URL,并在浏览器中完成全部解密。文件夹下载时可以在本地重新打包成 ZIP。 6. 后台清理任务会定期从存储中删除已过期或已删除的传输对象。 Xdrop 不会让服务端接触到明文文件名、路径、内容或解密密钥。服务端仍然能看到运行层面的元数据,例如传输时间戳、文件数量、分块数量、文件大小,以及限流标识符。 关键技术细节: - **加密模型:** 浏览器会为传输根密钥和分享链接密钥各生成一个 32 字节随机密钥。随后使用 HKDF-SHA-256 派生出清单和每个文件各自的 AES-256-GCM 密钥,并在分块加密时把 `transferId`、`fileId`、`chunkIndex`、大小和协议版本作为认证附加数据绑定进去。 - **分块上传:** 服务端会向浏览器声明分块大小、文件数限制和传输总大小限制。当前存储库默认使用 8 MiB 分块,最多 100 个文件,加密后的传输总大小上限为 256 MiB。 - **断点续传:** 当浏览器支持 OPFS 时,Xdrop 会把源文件持久化到本地;如果不可用,则在回退存储限制范围内使用基于 IndexedDB 的 Blob 存储。恢复上传时,浏览器会先询问 API 哪些分块已存在,因此即使刷新页面或重新打开浏览器,也只会补传缺失的部分。 - **发送方控制:** 管理令牌只会在创建时返回一次,服务端保存的是它的 SHA-256 哈希。开启隐私模式后,发送方本地控制信息可在上传完成后被清除。 - **后端职责:** API 从不解密载荷。它负责校验传输状态、限制速率、签发预签名 URL、存储元数据,并清理已过期或已删除的对象。 ## 系统架构 ```mermaid flowchart LR subgraph Sender["发送方浏览器"] Select["选择文件或文件夹"] Worker["加密 Worker