English | 汉语
Xdrop 是一款面向人类与智能体的开源端到端加密文件传输应用,它能确保明文的文件名、文件内容以及密钥都不会留存在服务器上。 ## 亮点 - 面向直接浏览器分享与智能体交接流程的端到端加密文件传输。 - 支持单文件和文件夹传输,接收文件夹时也可在本地重新打包为 ZIP 下载。 - Web 上传中断后可依赖本地暂存状态继续断点续传。 - 支持到期失效链接、发送方管理,以及上传后的可选隐私模式。 - 后端支持兼容 S3 的对象存储,并使用 PostgreSQL 和 Redis。 ## 通过智能体使用 智能体可以使用 Xdrop 上传文件,返回端到端加密的分享链接,并使用 Xdrop 链接进行本地解密。 安装存储库附带的 skill: ```bash bunx skills add https://github.com/xixu-me/xdrop/tree/main/skills/xdrop ``` 安装后,智能体可以直接在终端中使用 Xdrop 来: - 上传本地文件或目录,并返回加密分享链接。 - 接收完整的 Xdrop 分享链接(包含 `#k=...`)后,在本地下载并解密文件。 - 将重复性的文件交接流程自动化,而不必依赖浏览器界面操作。 示例指令: - `将 ./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、存储元数据,并清理已过期或已删除的对象。 ## 系统架构 下图展示的是面向人类用户的浏览器流程。智能体会针对同一套 API 与分享链接格式执行终端上传和本地解密。 ```mermaid flowchart LR subgraph Sender["人类发送方浏览器"] Select["选择文件或文件夹"] Worker["加密 Worker