保险库加密
- 随机生成的 256 位数据密钥使用 AES-256-GCM 加密压缩后的保险库。
- 主密码通过 Argon2id 1.3 派生独立的包装密钥,参数为 128 位随机盐、64 MiB 内存、3 轮、并行度 4。
- 包装密钥再以 AES-256-GCM 加密保险库数据密钥。修改主密码时可重新包装数据密钥,而无需降低保险库数据的加密强度。
- 格式、密码算法、压缩方式、密钥标识与密钥包装参数都作为附加数据进行认证,元数据被静默篡改时会拒绝解密。
每次需要时都会使用新的随机 IV。当前加密信封与保险库数据结构版本均为 4。
解锁会话与快捷解锁
成功解锁后,浏览器会话存储会暂存解包后的 256 位数据密钥和活动信息,而不是主密码。手动锁定、设置的自动锁定以及浏览器会话结束都会清除此状态。
在支持的环境中,可选快捷解锁使用 WebAuthn PRF 扩展,以本地身份验证器相关材料包装同一个数据密钥。它不会让 OTPManager 变成操作系统钥匙串,仍受浏览器与设备安全边界限制。
远程存储边界
WebDAV 与 S3 兼容服务商只接收加密信封和加密备份快照。凭据保存在加密保险库中。除本地开发明确使用的回环地址外,连接默认要求 HTTPS。客户端会拒绝不安全路径或对象键、端点内嵌凭据和跨来源 WebDAV 重定向,并设置响应大小、条目数量和超时限制。
加密无法对服务商隐藏所有元数据,它仍可能观察 IP 地址、时间、路径和密文大小。
网页隔离
页面内容脚本只获得识别和填入所需的最少数据,无法直接读取保险库,也不会收到 TOTP 种子或同步凭据。扩展页面采用严格的内容安全策略,执行代码从扩展安装包加载。
威胁模型限制
- 较弱或重复使用的主密码仍可能被猜出;Argon2id 能提高成本,但不能凭空增加熵。
- 恶意软件、被攻破的浏览器进程、已被控制的设备,或能调试已解锁扩展的本地人员位于信任边界内。
- 当你主动把验证码填入网站字段后,恶意网站可能观察该验证码。
- 远程服务商可以删除或回滚对象。备份与冲突检查能降低误操作损失,但不能替代独立恢复副本。
- 任何软件安全声明都不能保证绝不存在漏洞。
报告安全漏洞
请发送邮件至 samler@foxmail.com,主题注明“OTPManager security report”,并包含受影响版本、浏览器、可复现步骤、影响及安全的概念验证。请勿包含真实 TOTP 密钥、密码、远程存储凭据或他人数据。
协调披露:请在公开披露前预留合理时间用于调查和发布修复。欢迎不损害隐私、不干扰服务且不破坏数据的善意研究。