安全
安全
用平实的话说明 VaultWell 如何保护你存放的内容。也包括它无法保护的部分,以及我们尚未完成的事。
我们防范谁、防范什么
VaultWell 针对的是日常的隐私威胁,也就是大多数人真正会遇到的那些。
- 有人拿起你的手机。伴侣、亲戚、同事,或捡到手机的陌生人。没有路径,保险库就始终关着,即使他们知道你的手机密码也一样。
- 有人逼你解锁。你可以打开一个日常保险库或胁迫保险库。屏幕上不会显示还有其他保险库存在。
- 有人复制了 App 的文件。密钥与手机的安全硬件绑定,因此无法在高速计算机上进行猜测。
- 有人篡改了存储的文件。每个加密片段都经过认证,因此改动会被检测出来,而不会被显示。
它并非为抵御以下攻击者而设计:已经在你手机上安装了恶意软件的人、看着你划出路径的人,或能强迫你说出所有路径的人。没有任何 App 能对此作出承诺。
加密如何运作
- 路径。你在蜂巢上划过的格子顺序(至少八格,不可重复)就是输入。
- Argon2id。该输入经 Argon2id 强化,使用 64 MiB 内存和两轮运算,因此每次猜测都要耗费实实在在的时间和内存。
- 硬件绑定。结果会与一个保存在 iPhone 的 Secure Enclave 或 Android Keystore(可用时为 StrongBox)中的密钥相结合。这个密钥无法导出,因此只有在你的手机上才能算出最终密钥。
- 主密钥。每个保险库都有一个随机的 256 位主密钥,只以经路径密钥加密的形式存储。
- 分块 AES-GCM。内容以 1 MiB 为一块,用 AES-256-GCM 加密。每一块都与其所属项目和位置绑定,因此一旦被交换、重排或截断就会校验失败。缩略图、项目列表和设置也都经过加密。
没有账户,也没有服务器。你的密钥从不离开你的手机,保险库中的任何内容都不会发送给我们。
隐藏保险库,以及检查者仍可能看到什么
在屏幕上,VaultWell 不会透露任何信息。锁定画面只有蜂巢。错误的路径和从未用过的路径看起来完全一样。没有保险库列表,也没有数量。每个保险库的设置文件都被填充到相同大小,因此从外部无法分辨一个保险库的选项,包括它是否为胁迫保险库。
在存储层面,我们想说得精确一些。每个保险库都存储为一个独立的加密文件夹。能够完全访问 App 原始文件的人,例如对已解锁手机进行取证提取,可以数出这些文件夹的数量,也能数出有几个保险库设置了恢复短语。他们无法打开它们,也看不到里面的内容,但可以推断出存在不止一个保险库。我们计划减少这一点,例如加入诱饵条目,有变化时会公布详情。
在屏幕上
不透露任何信息
- 只显示蜂巢
- 没有保险库列表,也没有数量
- 错误的路径看起来就像从未用过的路径
在原始文件中,拥有完全访问权限时
可能被数出来的
- 有多少个加密的保险库文件夹
- 有多少个保险库设置了恢复短语
仍然无法读取的
- 任何保险库里有什么
- 哪个是胁迫保险库
胁迫保险库
当用路径打开胁迫保险库时,VaultWell 会先删除其他所有保险库的密钥文件及其恢复文件,然后移除这些保险库的文件夹。没有密钥文件,数据就无法解密。随后胁迫保险库会像其他保险库一样打开,屏幕上不显示任何提示。
- 在手机上的抹除是永久性的,无法撤销。
- 用恢复短语打开胁迫保险库不会抹除任何内容。
- 存放在其他地方的备份和共享不受影响。
备份与共享
备份(.vwbackup)必须能在新手机上打开,因此无法使用旧手机的硬件。取而代之的是,每份备份都会用 Argon2id 根据你的路径(如已设置,还有短语)以及一个全新的随机盐值来锁住保险库的主密钥。项目保持与存储时完全相同的加密状态。备份的安全取决于路径或短语的强度,因此请妥善保管备份文件。
共享(.vwshare)使用一个全新的随机密钥,由单独的共享短语锁住。项目会被重新加密到其中,因此接收者永远不会得知你保险库的密钥。打开次数、到期和导出的限制由 App 执行,而不是由密码学保证,因为没有服务器。拿到短语且有心之人仍然可以复制他们看到的内容。
我们不作的声明
- 尚未完成审计。我们计划在发布前进行一次独立安全审计,并会公布结果。
- 并非隐形。即使使用伪装图标,App 在你的手机上仍然可见,而且取证检查可能显示存在多个保险库。
- 在 iPhone 上无法完全防截屏。VaultWell 能防护屏幕捕获,但 iOS 不允许 App 阻止截屏;有截屏时 VaultWell 会告诉你。没有任何 App 能阻止别人对着屏幕拍照。
- 我们无法替你恢复。如果你丢失了路径和短语,我们帮不上忙。我们从未拥有它们。
报告问题
如果你发现了安全问题,我们非常感谢你先私下告诉我们;如果你愿意,我们会注明你的贡献。联系方式将在发布前公布。