一次登录真正需要的一切,都在一处。
记录不是固定的表单。把密码放在它的一次性验证码、恢复备注、用来付款的卡和通过电子邮件收到的文件旁边。它们保存在一起,也一起加密。
- 登录与密码附带一个把设置保存在您设备上的生成器。
- 一次性验证码两步登录的验证码,在您的设备上生成。
- 银行卡卡号、有效期和安全码作为普通的加密字段。
- 备注与文档普通备注,或受保护的备注,在您要求之前保持隐藏。
- 照片与文件扫描件、PDF 和图片,在封存前于您的设备上调整大小。
- Wi-Fi 网络由已保存的密码生成的 QR 码,供您的客人扫描。
- API 密钥与令牌在您显示之前保持隐藏,一步即可复制。
- SSH 密钥附带原生代理,每次使用前都会征求您的确认。
- 您自己的字段您需要的任何其他内容。编辑时不会丢弃任何东西。
- 完整历史每次更改都被保留。可以打开一条记录的任何早期版本。
搬家只需一次导入。
Confidex 可从 1Password、Bitwarden、KeePass 和 CSV 导入,也可导出回这些格式。用您的真实数据试一试;如果改变主意,可以带着全部数据离开。
- 1Password
- Bitwarden
- KeePass
- CSV
桌面
面向 Mac、Linux 和 Windows 的真正原生应用程序,用 Rust 编写,界面由 GPU 加速。没有 Electron,没有 Flutter,没有网页视图。
- macOS
- Linux
- Windows
离线优先
每台设备都保存完整的保险库。您可以随时同步,通过我们的服务器或您自己的服务器,也可以从不同步:把保险库留在一台设备上并备份到文件。如果两台设备的内容不一致,您会看到两个版本并自行选择。
两把钥匙打开您的保险库。除了您,没有人同时持有两把。
密码和秘密密钥共同打开存放保险库私钥的小锁. 记录单独加密, 每个修订版都有签名. 同步服务器验证签名, 无需接收任何一个解锁秘密, 也无需用户账户.
-
您的密码
由您记住。它从不存储在任何地方,也从不发送。
-
您的秘密密钥
由您的设备保存。在新设备上,您以传输码的形式输入一次:77 个字母和数字,每 7 个一组。
-
锁
保存着保险库密钥,只有两者齐备才会打开。Argon2id 刻意让每次密码猜测都很慢:每次尝试需要 64 MiB 内存和三轮运算。
单独一把钥匙改变不了什么。服务器上所有内容的副本甚至不能用来猜测您的密码,因为服务器从不持有秘密密钥。
您的设备通过一台无法窥视内容的服务器保持同步。
每次更改离开您的设备时都已封存并签名。服务器在您的设备之间传递密封盒并检查签名,因此其他任何人都无法更改您的保险库。它打不开任何一个盒子,而且在明文 HTTP 上和在 HTTPS 上一样安全。
服务器只负责存储和转发。只有来自您自己密钥的签名才能让更改进入。
锁定后,它就从内存中消失了。
保险库打开期间,密钥和您查看的记录存在于内存中。当您锁定时,Confidex 在那一刻就把它们丢弃。Rust 以确定性方式释放内存,没有可能让秘密多停留一段时间的垃圾回收器。剪贴板或操作系统制作的副本不在此保证范围内。
不是垃圾回收器决定您的秘密何时离开内存。锁定决定。
如果我们的服务器被攻破会怎样?
切换攻击者设法得到的东西。
切换攻击者拥有的东西。答案遵循项目文档中的威胁模型。
- 可以。两把钥匙合在一起即可打开保管库。这是唯一真正的进入途径。这也是您在全新设备上开启自己保管库的方式,因此密码与迁移码绝不能保存在一起。
- 可以。两把钥匙合在一起即可打开保管库。攻击者可以通过公开地址拉取封装数据并将其打开。请务必将密码与迁移码分开保管。
- 不能,只要您的密码足够强大。虽然密钥允许他们拉取锁并在离线状态下暴力破解密码,但每次猜测都需要耗费 64 MiB 内存和 3 轮 Argon2id 计算。长密码稳固可靠,短弱密码则存在风险。
- 不能。密钥从未发送到服务器。即便获知了密码,也无法对照数据库转储进行验证。推导锁密钥必须使用仅留在您设备上的私有密钥。
- 不能。他们无处使用该密码。没有密钥他们就无法派生锁密钥,而没有保管库地址,他们甚至无法拉取封装数据。
- 不能。根本无从猜测与核对。服务器上不存储任何密码、密码哈希或密钥。没有密钥,任何密码猜测都无法在数据库转储上进行验证。
使用我们的同步服务器,或自己运行同一个服务器。
服务器很小,因为它没有什么需要保护。它存储密封盒,为每个保险库维护一个计数器,并在接受更改之前检查签名。可以在任何机器上作为 Docker 镜像运行,也可以作为免费套餐的 Cloudflare Worker 运行,无需自己的服务器,也无需付费。新保险库使用 sync.confidex.me;一项设置即可把它们指向您的副本。
- 运行方式
- Docker 镜像、原生二进制文件,或免费套餐的 Cloudflare Worker。
- 索引
- 原生运行时使用 SQLite 或 PostgreSQL,在 Worker 中使用 D1。
- 对象
- S3 兼容存储桶、普通目录和 Git 仓库的任意组合。写入到全部目标;读取时逐个回退并校验摘要。
- 传输
- HTTP 或 HTTPS,由您选择。无论哪种方式,盒子都已封存并签名。
- 账户
- 没有。保险库通过上传其已签名的锁来注册。此后只有签名密钥的持有者才能更改它。
- 完全不用
- 同步是可选的。保险库可以留在一台设备上,备份到本地 ZIP 文件,永不接触网络。
- 许可证
- AGPL-3.0。您为他人运行的修改版本必须保持开源。
Confidex 不保护什么。
密码学保护静止和传输中的数据。它无法保护一台已解锁的设备,也无法隐藏一切。以下是我们已知的边界,如实陈述。
已解锁且被感染的设备
保险库打开期间,密钥和您查看的记录都在内存中。在那台设备上运行的恶意软件可以读取它们。离开时请锁定。
形态,而非内容
服务器能看到保险库和记录的标识符、哪个修订版本接在哪个之后、时间戳以及封存值的大小。内容、名称、类型和标签保持隐藏;形态则不会。
弱密码加上泄露的秘密密钥
持有您传输码的人可以离线尝试密码。Argon2id 让每次猜测都要付出 64 MiB 和三轮运算的代价,因此长的口令短语能够抵挡。短的则不能。
本地搜索索引
标题、网址、标签和未受保护的备注以明文形式在您的设备上建立索引以供搜索。索引永远不会离开设备,但任何读取您磁盘的人都能得知这些标签。
没有前向保密性
如果保险库的私密材料一旦暴露,在它之下封存的记录就可以被读取。更改密码会重新包装锁;它不会重新封存旧的修订版本。
应用之外的副本
锁定时清除内存覆盖的是 Confidex 持有的内容。剪贴板、浏览器和操作系统可能保留它们自己的副本。
给愿意核对的人看的构造。
纯 Rust 实现,没有 C 绑定。每个构造都有固定的测试向量,存储格式、锁、记录加密、签名和同步协议都逐字节地写入了规范。
密码学页面逐步跟随一个保险库,从它的第一个随机字节到一个已同步的修订版本:材料如何变成两个密钥对,锁如何封存和打开,修订版本如何加密、签名和命名,以及服务器验证什么。
- 创建保险库32 个随机字节、X25519 秘密密钥、Ed25519 签名密钥对、UUIDv5 地址、77 个符号的传输码。
- 锁Argon2id 64 MiB,结合秘密密钥的 HKDF-SHA256,对 33 字节的 XChaCha20-Poly1305,总共 344 字节。
- 记录与修订版本MessagePack,一次 zlib,HPKE base 模式,对精确字节的 Ed25519,SHA-256 修订版本 ID。
- 同步服务器分离的锁签名、钉住的密钥、精确字节、游标比较并推进。
- 哪些信息仍然可见标识符、父版本、epoch、大小和时间。没有任何可读内容。