Skip to content

安全

OpenKey 的设计目标是:服务器无法读取你的保险库。

密钥派生

Key derivation: Argon2id turns email and master password into a master key, which yields an auth hash for login and a wrapped vault key for AES-256-GCM ciphertext
  1. Argon2id(email + master_password, salt) 生成主密钥。
  2. 主密钥派生用于登录的 auth hash,并包装 保险库密钥
  3. 保险库密钥加密集合名称与条目载荷(AES-256-GCM)。
  4. 本地数据库加密密钥由保险库密钥派生。
  5. 主密码永不离开设备。

服务器存储内容

存储不存储
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。

请包含受影响包、已知版本/提交、复现步骤与影响。我们目标在 7 天内 确认报告。完整政策见包内 SECURITY.md(及 monorepo 根目录)。

实践建议

  • 选择强主密码——它是信任根。
  • 保持服务器 JWT_SECRET 足够长且唯一;启动时会拒绝占位符。
  • 生产环境优先使用 HTTPS,并收紧 CORS_ORIGINS(禁止 *)。
  • 离线备份保险库导出 / 恢复材料。

打包说明

已发布包包括 服务器浏览器扩展CLI文档(MIT)。本 monorepo 可能包含用于跨包协作的移动/桌面 OpenKey 应用 开发检出。见 概览软件包

API 细节见 openkey_server 软件包 README,以及运行中服务器的 /docs