2个稳定版本
2.0.0 | 2022年10月27日 |
---|---|
1.0.1 | 2018年7月5日 |
#2239 in 加密学
在2个crate中使用(通过libfortress)
33KB
634 行
Fortress
记住一个密码,安全地管理其他密码。Fortress安全性极高,可以在设备之间自动同步。
状态
Fortress正在积极开发中。我自己在使用它。不过它还不完全准备好投入生产,存在许多可能会让用户受伤的锋利边缘。
项目目标
- 自动同步 - 跨设备使用方便,易于备份。
- 强大安全 - 破解即使是弱主密码也需要花费数百万美元。
- 用Rust编写 - 错误更少,代码更干净。
- 简单设计 - 我选择了简洁性而非性能;更容易审计代码和设计。
- 无需信任 - 代码是开源的。数据同步是端到端加密的。
构建
可以使用cargo tauri build
构建生产二进制文件。
开发
在开发过程中,可以使用cargo tauri dev -- -- --dir [SOMEPATH]
运行主fortress
程序。它包括热重载。
fortresscrypto
crate实现了Fortress特有的所有加密功能。libfortress
实现了Fortress的大部分功能。fortress
是主二进制文件,主要实现用户界面。
不要忘记常规操作:cargo +nightly fmt
、cargo clippy
、cargo test
。
数据库格式
在核心上,Fortress使用加密JSON,因为JSON简单、可移植且可读。
Fortress数据库由一组对象组成,每个对象要么是目录,要么是条目。目录只是其他对象的列表,这构成了目录树。条目基本上就是一个HashMap,使得数据库易于适应未来的新功能。
Fortress数据库中的每个对象都存储了一个带时间戳的历史记录,以便用户可以回滚到之前的密码并撤销错误。所有对象的实现都采用追加方式,以确保用户数据永远不会丢失。
使用标准的格式如JSON意味着Fortress数据库可以使用现有的工具进行操作;甚至在Linux命令行上。虽然这不会很常见,但如果有人想要编写与Fortress数据库兼容的第三方工具,或者用户想要迁移到不同的密码管理器,这将很有用。
唯一的缺点是加密。没有好的标准加密格式。因此,Fortress必须使用自己的格式,但同样非常简单。在命令行上,Fortress可以使用其加密格式对有效负载进行加密/解密,因此仍然可以轻松访问数据库中的JSON。
加密
Fortress使用scrypt从用户的用户名和密码中派生出加密密钥,然后使用ChaCha20和HMAC-SHA-512的组合来加密和验证磁盘上的用户数据和同步时的用户数据。有关详细信息,请参阅ENCRYPTION.md。
Fortress服务器
后端“Fortress服务器”方便设备之间的同步。它实现在一个单独的仓库中,fortress-server。
重要提示
如果用户在极少数情况下希望拥有多个不同的Fortress数据库,他们必须为每个数据库使用不同的用户名。(不要与在多个设备之间同步的单个数据库的常见用法混淆。)Fortress和Fortress服务器没有“数据库ID”或类似的东西。因此,区分不同数据库的唯一方法就是使用不同的用户名。
依赖项
~1.6–2.4MB
~48K SLoC