简单说
- 在你的 Mac 上,密码、私钥和 API key 在 HostDock 的数据库里是加密的,加密用的密钥只放在 macOS 钥匙串里。
- 保险库(服务器、凭据、端口转发规则)同步时是端到端加密的。服务端存的是密文,永远拿不到你的同步密码。
- 云空间(笔记、脚本、文件站的文件、外观)不是端到端加密的,服务端看得到内容。
- AI 助手收不到服务器的地址、用户名和凭据。命令的输出发给你配置的模型之前,会尽力找出敏感信息遮掉。
- 同步是可选的。不登录的话,除了你的 SSH 连接和你发起的 AI 请求,什么都不离开你的 Mac。
在你的 Mac 上
HostDock 运行在 macOS 的应用沙盒里,用 Apple Developer ID 签名并经过苹果公证。它只能读你在选择文件的窗口里选中的文件。
密码、私钥、私钥口令、代理密码和 AI 的 API key,在写进 HostDock 本机的 SQLite 数据库之前都用 XChaCha20-Poly1305 加密,加密用的密钥只存在 macOS 钥匙串里。查看保存的密码或导出凭据时,要用触控 ID 或 Mac 的登录密码确认。
SSH、SFTP 和 TLS 都用 Rust 实现(russh 和 rustls)。HostDock 不调用系统的 ssh、scp,也不链接 OpenSSL。第一次连接时显示服务器的主机密钥指纹,之后指纹变了会警告你。
同步用的保险库
打开同步时,第一台设备随机生成一把 256 位的数据密钥。保险库里的每条记录离开你的 Mac 之前,都用从它派生出来的密钥加密。
| 记录的加密 | XChaCha20-Poly1305,每条记录一个随机的 24 字节 nonce。记录的 ID 和保险库的代数作为附加数据绑在一起,密文不能在记录之间调换,重置之后也不能被重放 |
|---|---|
| 记录的密钥 | 由数据密钥经 HKDF-SHA256 派生 |
| 同步密码 | 至少 10 个字符。Argon2id(64 MiB 内存、3 轮、16 字节随机盐)把它变成一把密钥,用来包住数据密钥 |
| 恢复码 | 160 位随机数,只显示一次,写成 32 个字符。它包住数据密钥的另一份副本 |
| 服务端存什么 | 你的邮箱、Argon2id 的盐和参数、包起来的两份数据密钥、加密后的记录 |
| 服务端拿不到什么 | 你的同步密码、恢复码和数据密钥 |
服务端还能看到什么。保险库的每条记录带一个明文的类别(服务器、密码和密钥、凭据、转发规则、设置),用来执行套餐的上限。所以我们能看到你有几台服务器、几份保存的凭据,以及每条记录的大小和修改时间。看不到名字、地址、用户名、密码和密钥。
删除要用你的密钥。只有解得开的删除记录,HostDock 才会删掉本机的数据。服务端上少了某条记录,HostDock 当作是服务端弄丢了,重新上传。服务端重放的旧密文会被拒绝。
云空间不是端到端加密的
笔记、脚本库、文件站的文件和文件夹、外观设置和你的个人资料,走的是另一条通道,不用保险库的加密。它们传输时用 HTTPS 保护,存放时是原样的,也就是说我们的服务端能读到、也能改动这些内容。登录时应用里会告诉你这一点。
这样取舍是为了登录之后云空间马上能用,不需要同步密码。HostDock 从不把保险库的数据(服务器地址、凭据)放到这条通道上;但如果你把密码写进了笔记,它就是不加密存放的。密码这类东西请放进保险库。
文件的内容经短时有效(15 分钟)的签名地址,直接在你的 Mac 和对象存储之间传输,不经过我们的接口服务器;下载之后 HostDock 会核对每个文件的 SHA-256。
你的账号
- 登录用发到邮箱的 6 位验证码,10 分钟内有效。没有账号密码,也就不存在泄露或在别处重复使用的问题。
- 会话令牌在服务端只存 SHA-256 哈希。每个账号最多 10 台设备,可以远程让任何一台下线。
- 删除账号会永久删除服务端上这个账号的全部数据。
AI 助手和 MCP
- 应用内的助手连的是你配置的 AI 服务商。模型看得到服务器的名字和分组,看不到地址、端口、用户名和凭据。
- 命令的输出发出去之前,HostDock 会遮掉私钥、网址里的账号密码、Authorization 头、password 和 token 一类的字段,以及常见格式的令牌(OpenAI 的 sk-、AWS 的 AKIA、GitHub、Slack、JWT)。这靠的是规则匹配,格式少见的可能漏掉。
- 对话记录存在你的 Mac 上,没有加密,也从不同步。
- MCP 服务只监听 127.0.0.1,每个请求都检查 Bearer 令牌,Host 和 Origin 不是本机的一律拒绝。令牌加密保存,从不同步。
已知的弱点
- 邮箱就是账号的钥匙。控制了你邮箱的人可以登录并下载你加密的保险库。他还得离线猜你的同步密码,而每猜一次都要过一遍 Argon2id;所以保护你的是一个够长、别处没用过的同步密码。Termius 那一类保险库也有这个弱点;HostDock 没有 1Password 那样额外的 Secret Key。
- 秘密都丢了就恢复不了。同步密码和恢复码都丢了、也没有还登录着的设备,保险库就谁都解不开了,我们也不行。
- MCP 的局域网访问不加密。如果你让某个 MCP 令牌可以从局域网访问,它的流量是明文 HTTP。这项默认关着。
报告安全漏洞
请把细节发到 security@hostdock.dev。公开之前,请给我们修复的时间。