你可以构建什么
没有存储的密码管理器:每个服务的秘密从用户的种子短语和该服务的名称导出——在每个设备上结果相同,永远如此,且永远不会在任何地方持久化。新手机加十二个词即可恢复所有密码。
它是如何工作的
每个上下文的 Handle 导出每个服务上下文的一个秘密:
const work = await identity.deriveHandle('work');
const githubSecret = work.derivePassword('github.com', 32);
const jiraSecret = work.derivePassword('jira.internal', 32);
@me2em/crypto 添加了护栏:为需要用户手动输入而非导出的秘密配置 Argon2id,以及对罕见的手选密码进行 HIBP 泄露检查。
优势
- 零存储。 没有存储文件、没有云同步、没有攻击面——密码仅在使用的瞬间存在。
- 确定性恢复。 相同种子 + 相同上下文 → 相同秘密,在每个设备上,无需同步。
- 按上下文隔离。 工作 Handle 被入侵永远不会导出个人 Handle 的秘密。
- 不存在重置流程。 没有”忘记密码”,因为没有存储密码。
权衡
- 种子是唯一的失败点。 丢失短语——每个导出的密码都丢失了;按设计没有恢复。
- 旋转是结构性的。 更改秘密意味着更改其上下文名称——计划按服务的旋转而非就地更新。
- Alpha。 包 API 是 1.0 之前版本;固定版本。
链接
- 场景 8 在协议使用场景指南
- 为什么我们不存储你的种子短语——零存储模型
- 什么都不存的密码管理器