安全
OpenKey 的设计目标是:服务器无法读取你的保险库。
密钥派生
Argon2id(email + master_password, salt)生成主密钥。- 主密钥派生用于登录的 auth hash,并包装 保险库密钥。
- 保险库密钥加密集合名称与条目载荷(AES-256-GCM)。
- 本地数据库加密密钥由保险库密钥派生。
- 主密码永不离开设备。
服务器存储内容
| 存储 | 不存储 |
|---|---|
auth_hash | 主密码 |
| 盐与 KDF 参数 | 明文保险库密钥 |
| 包装(加密)后的保险库密钥 | 解密后的集合名称 |
| 保险库数据、附件、组织与共享的不透明密文 | 明文条目载荷 |
组织共享条目(组织集合下的 encrypted_payload) | 组织密钥明文(客户端通过包装的组织密钥解包) |
软删除的保险库项会作为 tombstones 保留,直到对等端同步;最后写入获胜使用每项的 revision。
令牌
- 访问 JWT 生命周期很短。
- 刷新令牌在静态存储时被哈希,并在使用时轮换。
- 认证接口按客户端 IP 限流。
威胁模型
信任边界
| 组件 | 信任假设 |
|---|---|
| 设备 / 本地保险库 | 解锁期间的信任根;操作系统用户可读内存与加密数据库文件 |
| 自托管同步服务器 | 对机密性不可信 — 仅密文;对可用性与 auth-hash 比较可信 |
| 浏览器扩展 | 解锁后可信持有保险库明文;网页不得在故意自动填充之外获得密钥。开放网络上的填充/捕获/WebAuthn 需要 <all_urls> — 见 浏览器扩展 |
| 原生消息主机 | 仅本地桥接到已解锁桌面应用;仅在保险库解锁时响应 |
| CLI / 桌面桥接 | 与已解锁应用会话相同的本地信任 |
| Nearby / 局域网配对 | 配对对端共享会话密钥;链接保险库 后交换保险库密钥材料并在 LAN 上同步密文 — 将配对 + 链接视为完整保险库信任 |
攻击者能做什么 / 不能做什么
| 攻击者 | 能 | 不能(设计上) |
|---|---|---|
| 被攻陷的服务器管理员 | 删除/扣留密文、替换 blob、观察元数据(邮箱、大小、时序) | 解密保险库条目、仅凭 auth_hash 恢复主密码 |
| 无 TLS 的网络中间人 | 截获传输中的 JWT 与密文 | 没有保险库密钥则无法读明文 |
| 被盗且已锁定的设备 | 对 Argon2id 包装的保险库做离线攻击(需要强主密码) | 没有主密码 / 生物识别包装则无法解锁 |
| 被盗且已解锁的设备 | 从内存 / 活动会话读取明文 | —(超出范围) |
| 恶意网页 | 触发自动填充 UI;尝试钓鱼 | 未经用户/扩展中介则无法通过内容脚本读取完整保险库 |
| 恶意组织/共享对端 | 共享你为其包装密钥后可解密的密文 | 无法解密无关的个人保险库项 |
| 恶意 Nearby 对端 | 发送条目 / 声称 LAN Pro / 在链接后接收保险库密文 | 在商店 IAP 平台解锁 Pro(Android/iOS/macOS 忽略 LAN Pro);没有共享保险库密钥则无法解密 LAN 密文 |
明确的非目标
- 无主密码恢复 — 丢失即密文不可恢复。
- 服务器无法解密 保险库、附件、组织或共享载荷。
- 同步是按 revision 的 LWW,不是 CRDT — 并发编辑可能覆盖;陈旧推送失败时服务器回显获胜行。Nearby 局域网保险库同步 在已配对且已链接的设备间使用相同 LWW 规则(不能替代离线备份)。
- LAN Pro 证明 是无商店 IAP 平台上已配对设备之间的便利 — 不是购买的密码学证明。
运维加固清单
- 设置强且唯一的
JWT_SECRET(最少 32 字符;启动时拒绝占位符)。 - 生产环境在 API 前终止 HTTPS。
- 保持
CORS_ORIGINS为显式允许列表(永不使用*)。 - 空闲时优先 锁定 保险库;谨慎启用生物识别解锁。
- 使用 设置 → 安全 → 密码健康 查找弱/重复密码;可选 HIBP 检查仅发送 SHA-1 哈希 前缀(k-匿名),从不发送密码。
- 将导出 / 备份视为机密材料 — 离线加密存放。
- 仅与你信任的人/设备配对 Nearby;链接保险库 通过 LAN 会话共享保险库密钥材料 — 取消配对以撤销 LAN Pro 声明并停止同步。
- 私下报告漏洞 — 见 报告漏洞。
报告漏洞
若你认为在 OpenKey(服务器、扩展、CLI、文档或应用)中发现了安全问题,请 私下 报告。
不要 为可利用漏洞开公共 GitHub issue。
- 邮箱:[email protected]
- 或在 OpenSelfHosting 下开 私有 安全公告
请包含受影响包、已知版本/提交、复现步骤与影响。我们目标在 7 天内 确认报告。完整政策见包内 SECURITY.md(及 monorepo 根目录)。
实践建议
- 选择强主密码——它是信任根。
- 保持服务器
JWT_SECRET足够长且唯一;启动时会拒绝占位符。 - 生产环境优先使用 HTTPS,并收紧
CORS_ORIGINS(禁止*)。 - 离线备份保险库导出 / 恢复材料。
打包说明
已发布包包括 服务器、浏览器扩展、CLI 与 文档(MIT)。本 monorepo 可能包含用于跨包协作的移动/桌面 OpenKey 应用 开发检出。见 概览 与 软件包。
API 细节见 openkey_server 软件包 README,以及运行中服务器的 /docs。