Submarine 如何保护您的密码
Submarine 会在您的设备上加密密码库,任何数据在离开设备之前就已加密。保存密码库的服务器只能看到加密数据,中间也不存在任何 Submarine 账户或 Submarine 服务器。本页说明哪些内容受到保护、如何保护,以及哪些工作尚未完成。
您的密码库密钥
每个密码库都有自己的密钥,在您创建密码库时于您的设备上生成。持有这个密钥的人可以打开密码库,其他任何人都不行:服务器不行,我们也不行。
- 创建密码库时,Submarine 会向您显示它的密钥。请把它存放在安全的地方,例如写在纸上,或存进您已经在用的密码管理器。
- 您也可以用自己选择的密码加密保存这个密钥。这样,打开密码库就需要同时具备加密的密钥和它的密码。
- 密钥一旦丢失,没有人能恢复。由于没有账户,也没有重置链接,请务必保留一份密钥的副本,或加密的密钥及其密码的副本。
在您的设备上
- 您的密码库在每台设备上都用该设备的密钥加密。
- 您的锁定密码保护着这个密钥。Submarine 使用 Argon2id 将锁定密码转换为密钥,这种方法专门设计用来让猜测密码变得缓慢且代价高昂。忘记的锁定密码同样无法找回:届时您需要用各个密码库的密钥重新打开它们。
- 您可以用指纹、面容或锁屏代替锁定密码来解锁 Submarine。
- Submarine 会在您选择的时间(从立即到几小时)过后自动锁定,并在锁定时从内存中清除您的密码库。
- 复制的密码会在您选择的时间过后从剪贴板中清除。
- 在 Android 上,除非您允许,否则 Submarine 会阻止截屏和录屏。
在服务器上
您的密码库存放在 Nostr 中继上:这些开放的服务器由独立的运营者运行,任何人都可以使用,也可以自己运行。每个密码库都会复制到多个中继,因此即使其中一个停止运行,密码库也不会丢失。保存密码库的中继由您选择,也可以包括您自己的中继。
您做出的每项更改都会先在您的设备上加密,再装进一个密封的信封发送到中继。中继能看到:
- 它无法读取的加密数据;
- 密码库的公钥,借此它知道哪些信封属于同一个密码库,但不知道里面装的是什么;
- 一个在更改前两天内随机选取的日期,而不是更改的实际时间;
- 您的 IP 地址,和您访问的任何网站一样。
中继也无法篡改您的密码。每项更改都用密码库密钥签名,Submarine 会忽略任何未经密码库签名的内容。
没有账户,没有跟踪
- 没有 Submarine 账户,也没有 Submarine 服务器保存您的数据。
- Submarine 没有数据分析,没有崩溃报告,也没有广告。
- 代码以 MIT 许可证开源,任何人都可以查看 Submarine 做了什么。查看源代码。
尚未完成的工作
Submarine 的安全性尚未经过任何独立机构的审计。在此之前,请将最重要的密码(例如邮箱和银行的密码)保存在久经考验的密码管理器中,先从其他密码开始使用。
如果您发现安全问题,请报告给我们,或通过 Nostr 联系我们。
技术细节
完整的格式见 Nostr Passwords 协议。
- 密码库是一个 Nostr 密钥对。它的密钥以
nsec形式显示,加密形式是 NIP-49ncryptsec(先 scrypt,再 XChaCha20-Poly1305)。 - 每项更改都是项目的一个新版本:一个由密码库签名的事件,用 NIP-44(ChaCha20 和 HMAC-SHA256,并经过填充以隐藏确切长度)加密给密码库,再放进 NIP-59 礼物包装(gift wrap)中。礼物包装由一次性密钥签名,日期随机设在之前两天内。
- 项目就是 Bitwarden 项目,因此 Submarine 能导入和导出 Bitwarden 的格式。
- 在设备上,密码库密钥由设备密钥通过 AES-256-CBC 和 HMAC-SHA256 加密。设备密钥由锁定密码通过 Argon2id 保护,或保存在系统的安全存储中。密码库的本地副本用 AES-256-GCM 加密。
- 如果您使用 Nostr,可以让签名器保管密码库密钥,使它永远不会进入 Submarine:可以是远程签名器 bunker(NIP-46)、Amber 等签名应用(NIP-55),或浏览器扩展(NIP-07)。