安全说明
一、报告安全问题
发现安全问题请发邮件至 voellin@yeah.net,不要开公开 issue,也不要在群里公布。邮件请写清:受影响的组件与版本、复现步骤或概念验证、你认为的影响范围。加密相关的问题请附上构造的输入与预期/实际输出。
我们的承诺:
| 节点 | 时限 |
|---|---|
| 收到确认 | 2 个工作日内 |
| 分级与初步结论 | 7 天内 |
| 修复上线 | 已确认的问题 90 天内;涉及协议或密钥格式变更的,会告知具体计划 |
| 公开披露 | 修复上线后,与报告者协商时间;报告者署名,除非你不愿意 |
也请你遵守:服务端不开源,测试只能打在线上的 deephub.cyou。请只用自己的账号;不访问、不修改、不留存其他用户的数据;不做压力或拒绝服务测试;不做社会工程。
In English. Please email voellin@yeah.net with a description, affected version, and reproduction steps. Do not open a public issue. We acknowledge within 2 business days, triage within 7 days, and aim to ship a fix within 90 days for confirmed issues. The server is not open source, so testing necessarily goes against the live deephub.cyou. Use your own accounts only; never access, modify, or exfiltrate other users' data; do not run denial-of-service or load tests.
二、适用范围
| 组件 | 说明 |
|---|---|
| DeepHub 桌面客户端 | Windows / macOS,安装包从本站分发 |
dsh-deephub-share 插件 | DeepSeek Harness 的第三方插件,开源。与桌面端共用同一套云端协议实现 |
| 云端 API 服务 | 部署在 deephub.cyou |
| 官网与更新分发 | deephub.cyou 及其 /updates/ |
不在范围内:DeepSeek、豆包等第三方模型服务,飞书 / 钉钉官方命令行工具,以及随软件捆绑的 Chromium 等第三方程序。
三、威胁模型
| 对手 | 意图 | 我们的立场 |
|---|---|---|
| 服务器运营方、被攻破的服务器、拖库者 | 读取你的会话、设置、分享内容 | 防住。服务器只保管解不开的密文,没有你的密码、主密钥、恢复码和身份私钥。但它看得到元数据,也能拒绝服务、扣住或回退你的数据 |
| 网络攻击者(中间人、恶意 Wi-Fi、伪造 DNS) | 篡改请求与响应、冒充服务器、重放 | 防住篡改与冒充。请求由你的设备签名,响应由服务器签名,这一层与 TLS 证书无关,证书被伪造时仍然成立 |
| 其他用户(朋友或陌生人) | 冒充你的朋友、往你名下写入内容、探测某个账号是否存在 | 短 ID 只能发起好友请求,关系须由你点同意;分享走收件箱,取回之前可直接拒绝;账号是否存在,从服务器的响应上分辨不出来 |
| 取得你电脑的人 | 读取本机的密钥与数据 | 只防到操作系统账户这一层,且两个客户端强度不同,见第六节 |
明确不防的:
- 以你的系统账户身份运行的恶意软件。
- 弱密码。密码是抵挡离线爆破的唯一屏障,软件只强制最少 10 位。
- 同时丢失全部设备、忘记密码、又没有抄录恢复码。零知识设计下数据不可恢复,我们没有你的钥匙。
- 模型服务商看得到你发给它的内容。DeepHub 需将会话内容发送至 DeepSeek 等模型接口才能工作。零知识只针对 DeepHub 自身的云端同步,不针对模型服务。
四、加密设计
DeepHub 不自研密码算法。所用的五个原语全部为公开标准,实现一律使用 Node 内置的密码库,不引入第三方实现:
| 用途 | 算法与参数 | 说明 |
|---|---|---|
| 密码派生密钥 | scrypt,N=216,r=8,p=1,输出 32 字节,16 字节随机盐 | 参数随账号保存。该档位按移动设备可承受的内存选定(约 64 MB),低于 OWASP 推荐的 N=217,以最少 10 位密码作为补偿。新账号与改密码时可提档 |
| 子密钥分叉 | HKDF-SHA256 | 登录凭证与加密钥匙从同一源头分叉,互相推不出来 |
| 内容加密 | AES-256-GCM,12 字节随机 IV,16 字节认证标签 | 每条内容使用独立的随机数据密钥 |
| 请求与响应签名 | Ed25519 | 每台设备一把,服务器一把 |
| 朋友之间协商密钥 | X25519 + HKDF-SHA256 | 用于端到端加密的分享 |
| 恢复码 | 112 位随机熵,Crockford Base32 编码,23 位数据加 1 位校验,显示为 6 组 4 字符 | 校验位在本机拦截误输入 |
密钥层次
密码 ──scrypt──▶ 中间密钥
├─ HKDF ─▶ 登录凭证 ──sha256──▶ 上传(服务器再加盐哈希后保存)
└─ HKDF ─▶ 包装钥匙 ─────────────▶ 永不离开你的电脑
恢复码 ──HKDF──▶ 恢复用的包装钥匙
主密钥(32 字节随机,你的数据真正的钥匙)
├─ 被包装钥匙裹住 ──────▶ 存在服务器(服务器打不开)
├─ 被恢复用钥匙裹住 ────▶ 存在服务器(服务器打不开)
└─ 裹住每条内容自己的数据密钥
每条内容:随机数据密钥 ──AES-256-GCM──▶ 密文
三个推论:
- 改密码不动数据。只是把主密钥重新包一次,几十万字的会话一个字节都不用重传。
- 服务器从登录凭证推不出包装钥匙,因此推不出主密钥,因此打不开任何一条密文。
- 恢复码是主密钥唯一的另一把备份。由你保管,我们没有副本。
五、账号、设备与朋友
设备
- 每台设备在首次启动时生成一把自己的签名密钥,私钥永不离开本机。此后所有已登录的请求都由它签名,密码凭证只在注册、新设备登录、改密码三种情况下上传。
- 新设备登录需要一台已登录的设备确认。账号下没有任何活跃设备时直接放行——否则无人可批准,账号将被永久锁死。
- 任何活跃设备都可以退出其它设备。
- 改密码与重新生成恢复码都需再次输入当前密码。仅持有设备密钥无法完成这两项操作。
账号恢复
忘记密码时,恢复流程需要两样东西同时具备:邮箱收到的验证码,以及你的恢复码。服务器会验证请求方确实用恢复码解开了主密钥——只拿到邮箱是不够的。
恢复成功会退出该账号的其它所有设备,并激活当前这一台。因此怀疑某台设备不在自己手上时,走一次账号恢复比改密码更彻底。
朋友与分享
- 短 ID 只能用于发起好友请求,关系须由收件方点同意才建立。不提供「按短 ID 查人」的接口。
- 对「ID 不存在」「是你自己」「已被对方拉黑」「已有待处理的请求」这四种情况,服务器的响应完全一致,从外部分辨不出来。
- 分享的内容走收件箱:取回之前只能看到发件人、大小、附件数与时间。标题在密文里,服务器自身也看不到,因此收件箱不提供预览。
- 发件人身份由设备签名决定,不采信内容中自称的身份;收件人用服务器登记的发件人公钥解密,冒充者解不开。
六、你电脑上的数据
本节两个客户端不同,请按所安装的版本阅读。
DeepHub 桌面客户端
| 内容 | 保护方式 |
|---|---|
| 设备签名私钥 | 用操作系统的密钥保护接口加密(Windows 为 DPAPI,macOS 为钥匙串)。接口不可用时降级为仅当前用户可读的明文文件,并在设备信息中如实标记 |
| 主密钥缓存(用于免密启动) | 同上加密;接口不可用时不缓存,改为每次启动输入密码,绝不明文落盘 |
| 身份私钥缓存 | 同上 |
| 会话、记录、设置、知识库 | 明文 JSON,依赖系统账户隔离与磁盘加密(BitLocker / FileVault) |
主密钥、恢复码与身份私钥只存在于软件主进程,不会传到界面层。唯一的例外是注册时将恢复码显示给你抄写,确认后立即清除。
dsh 插件
插件运行在 DeepSeek Harness 中,没有操作系统密钥保护接口可用。四条密钥记录存放在 dsh 自身的凭据文件里,与 dsh 的模型 API Key 同一文件、同一套文件权限:设备签名私钥、主密钥缓存、身份私钥均为明文,文件权限限制为仅当前用户可读。
相同:两者都挡不住以你自己的系统账户身份运行的程序——系统密钥接口本身即绑定系统账户。
不同:桌面端的密文离开这台机器或这个系统账户即无法打开;插件的凭据文件被拷走即为明文。因此在磁盘被镜像、备份外泄、机器转手、文件被跨系统账户复制这几类情况下,插件一侧没有保护——取得该文件即等同于取得主密钥,可解开该账号在服务器上的全部密文。
这是为免密启动有意接受的取舍,插件界面已标注保护级别。若你的顾虑包含「这台机器的磁盘可能落到别人手里」,请在插件中退出登录(清除主密钥与身份私钥,保留设备密钥),或只使用桌面客户端。
将来 dsh 的凭据存储接入系统钥匙串时,插件会自动受益,无需改动。
七、防退化措施
- 回归断言:改动密钥体系、待签名字节的构造、服务端鉴权之前,必须先跑一套固定的回归脚本。它覆盖密钥派生与信封加密、客户端与服务端待签名字节的逐字节交叉验证、身份密钥、针对本地服务端的端到端流程,以及服务端全部路由。
- 对抗式复核:安全与协议设计在定稿前固定做一轮攻击者视角的复核,由不同于实现者的一方执行,目标是推翻结论。被推翻的结论留档,不删除。
- 不可变约束:密钥派生的标识字符串、信封格式、待签名字节的结构、短 ID 的校验算法——这些一旦改动即等同于更换协议版本,老数据将无法解开。它们在代码中被单独标记,不允许顺手修改。
- 依赖克制:服务端只有一个原生依赖;密码学全部使用运行时内置实现,不引第三方密码库。
- 凭据管理:发信凭据只从环境变量读取;服务器签名私钥仅服务进程可读;代码仓库中没有任何密钥。
八、变更
本页如有变更,会更新顶部的「最后更新」日期。涉及加密设计或安全边界的重大变更,会在软件内提示。