合理否认与按图案分隔的保险库
有人要求您打开 Vaultaire。您绘制一个图案,一个加密保险库随即打开,不会出现列出其他保险库的菜单。不同的图案可以打开不同的保险库。这在界面层面提供了实用的隔离,而对能检查 App 容器的人,它的局限也很明确。
Vaultaire 的合理否认功能用不同的图案对应不同的加密保险库索引,并且不显示跨保险库列表。在普通的界面检查中,这可以隐藏其他保险库;但对能访问 App 容器的检查者,磁盘布局会暴露保险库数量。
合理否认的真正含义
在最严格的密码学意义上,合理否认指可观察到的存储无法证明还存在其他受保护内容。在日常产品用语中,这个词也指诱饵凭证:展示一个视图,同时隐藏另一个。这是两种不同的标准。Vaultaire 当前的实现达到的是界面隔离目标,而不是信息论意义上的否认性。
大多数保险库应用只是把一个保险库放在密码后面。如果有人逼你打开它,一切都会暴露。有些应用提供 “诱饵模式”,让你设置第二个密码来显示假界面。但这些实现通常只是表面功夫。取证检查员可以检查应用数据、查看配置标志、注意到加密数据大小与可见文件不匹配,或者找到暴露隐藏层存在的元数据。
Vaultaire 采用按图案寻址的方式。5×5 网格上的每个有效图案都会派生出不同的候选保险库密钥。App 对该密钥做哈希,算出预期的加密索引文件名;如果该索引存在,就打开并验证它。加密索引文件本身可以被枚举和计数,但不存在将图案或保险库名称对应起来的明文注册表。
如果对应的索引存在且 AES-GCM 认证成功,您会看到该保险库中的文件。否则,Vaultaire 会显示空状态,并可以为该图案创建新的保险库。锁屏不会报错,不会提到其他保险库,也不会显示列表。这种安静的界面有助于应对随手检查,但不会消除下文所述的文件系统证据。
传统保险库 App 通常会打开一个可见的容器列表。Vaultaire 则让 每个图案对应一个加密索引。通过界面操作的人只能看到选中的保险库,看不到其他保险库的目录。文件系统检查者看得更多,可以根据存储目录统计保险库数量。
底层工作原理
其技术基础是把由图案派生的寻址与认证加密结合起来。不同的图案产生不同的候选密钥和文件名。随后 AES-GCM 提供明确的完整性检查:正确的密钥能通过加密索引的认证,错误的密钥则会失败。这个认证结果有助于安全,但也意味着被复制的数据可用于离线验证猜测。
不同图案,不同密钥
当您绘制图案时,Vaultaire 会将点序列和网格大小序列化,再结合存于 Keychain、全设备通用的随机盐值,运行 600,000 轮 PBKDF2-HMAC-SHA512。该函数输出一个 256 位的保险库密钥。不同的图案输入应产生互不相关的密钥,但凭证的安全性仍受限于图案被猜中的难易程度。256 位的输出并不会让人画出的图案具备 256 位熵。
每个密钥解密自己的 Blob
Vaultaire 将每个保险库的文件映射和经过包装的随机主密钥存放在一个用 AES-256-GCM 加密的索引中。当您绘制图案时,App 会派生候选保险库密钥,并查找对应的密钥指纹文件名。如果文件存在,认证解密只会成功或失败;AES-GCM 不会输出看似有效的乱码明文。如果没有打开任何有效索引,界面会显示空状态,而不会列出其他保险库。
没有明文的跨保险库目录
Vaultaire 没有面向用户的数据库表把图案对应到可读的保险库名称。普通解锁流程通过派生密钥找到一个索引。在磁盘上,每个保险库都有一个“vault_index_<locator>.bin”根文件,位于以 64 个为一组、用随机掩护文件填充的池中,另有一个以相同定位符命名的存储目录。App 本身会枚举这些文件以维护存储。定位符不会透露对应的图案,但存储目录的数量会暴露本地保险库的数量。
两个保险库同样真实。两者用同一种算法加密,产生同一类加密输出。没有任何标志、标记或元数据把其中一个标为“真”、另一个标为“诱饵”。从数学上看,两者完全相同。
诱饵保险库策略
只有当您有东西可以展示时,合理否认才管用。空保险库会引人怀疑;明显没有任何值得保护内容的保险库,同样可疑。最有力的防御,是一个看起来和别人预期中一模一样的保险库。
设置诱饵保险库
选一个在压力下也能快速、自然画出的第二个图案,用它创建一个保险库。放入对保险库 App 用户来说合情合理的内容:比如一些您不想公开、但并不敏感的个人照片,几份财务文件,一些笔记。内容要可信,最好还略带尴尬,足以让搜查您手机的人以为已经找到了您想藏的东西。
让诱饵更可信
好的诱饵保险库有几个特点。文件数量要合理:太少会显得空得可疑,太多又说不通(为什么要保护那么多平淡无奇的内容?)。文件要足够新,看得出您在经常使用。理想情况下,这些内容还能合理解释您当初为什么要安装保险库 App。
只能接触解锁界面的人会看到选中的保险库,但看不到跨保险库选择器。这能减少随手检查时的暴露。能访问文件系统的人可以统计保险库数量,可能会知道存在多个本地保险库,尽管他们仍无法把索引对应到图案,也无法读取内容。
受到胁迫时
如果您被迫解锁设备,请绘制诱饵图案。保险库打开,文件随之出现。普通界面中没有可被发现的隐藏菜单或跨保险库列表。拿着您手机的人看到的是一个已解锁的保险库。这让随手检查时展示的内容前后一致,但文件系统检查仍可能发现其他加密索引。
除非绘制对应的图案,否则您的敏感保险库不会出现在界面中,也不会藏在某个隐藏菜单里。但它的加密索引仍存在于 App 容器中,因此不应把这一功能视为能抵御各种强制披露或取证分析的保护。
准确界定安全边界
对于加密内容,Vaultaire 可以作出有力的保证;对于界面,保证则较为有限。AES-GCM 保护索引及其文件中的内容。按图案寻址让其他保险库不出现在可见的解锁流程中。但这两点都无法让能读取 App 容器的检查者看不到加密索引文件的数量。
加密内容保持机密
在密钥和随机数处理正确的前提下,AES-256-GCM 能隐藏明文并检测篡改。检查者可以根据名称和位置识别 Vaultaire 的索引和 blob 文件,但没有相关密钥,就无法读取受保护的文件映射、经过包装的主密钥、文件名、元数据、缩略图或文件内容。
索引可被枚举,但没有明文图案映射
文件系统能说明有多少个保险库,因为每个保险库都有自己的存储目录。但它不提供明文映射,无法把这些指纹对应到生成它们的图案、面向用户的保险库标签或解密后的内容。这是一条有用的边界,但并不能隐藏数量。
离线猜测验证依然存在
复制了设备盐值和加密 App 数据的攻击者,可以用猜测的图案派生候选密钥。对应的索引指纹会告诉攻击者是否存在匹配的文件名,而 AES-GCM 认证解密几乎可以确证猜测正确。PBKDF2 提高了每次猜测的成本,但无法阻止这种离线测试,也无法为弱图案增加熵。
空状态的作用
在锁屏上,Vaultaire 不会提示“图案错误”,也不会显示其他可用的保险库。不匹配的图案会进入空状态或创建流程,因此只能操作界面的人得不到保险库列表。但这种展示层面的优势不能套用到已复制并分析底层文件的攻击者身上。
强制披露相关法律因司法管辖区和具体情况而异。Vaultaire 的界面无法决定当局能推断、要求或证明什么,而加密索引文件的数量本身就可能暴露存在多个本地保险库。请就您的情况咨询合格的律师,不要把产品功能当作法律结论。
谁需要合理否认
您可能以为合理否认只和间谍、举报人有关。实际上,数以百万计的普通人都面临这样的处境:在胁迫下保护信息的能力不是奢侈品,而是必需品。
记者及其消息来源
调查记者经常携带敏感材料:消息来源身份、泄露的文件、采访录音。在许多国家,记者在边境、检查站或突击搜查中被扣留、设备被翻查是常有的事。放着普通笔记和已发表照片的诱饵保险库可以提供掩护,真正的保险库则保护那些可能要靠匿名才能安全的消息来源。
活动家和组织者
政治活动人士、劳工组织者和人权工作者所处的环境中,手机可能成为监控目标。不同的图案可以隔离日常使用 App 时显示的内容,但被没收或被入侵的手机可能暴露加密索引的数量,并让离线猜测图案成为可能。行动安全必须延伸到 App 之外。
遭受虐待的人
记录受虐经历的人可能需要把敏感证据与可以安全展示的材料分开。对于只能接触 App 界面的人,第二个保险库可以减少暴露。但它无法防范设备监控、间谍软件、胁迫或文件系统检查,因此身处危险的用户应听从当地可靠支持机构的指导。
跨境旅行者
各地的边境搜查权限和旅客义务各不相同。用一个图案打开 Vaultaire 不会显示跨保险库列表,但无法让其他加密索引完全躲过取证检查。请尽量少携带敏感数据,并针对您的路线和情况获取最新的法律建议。
任何重视隐私的人
隐私不是身处危险的人才需要。也许您写私人日记;也许您有不想被人偶然看到的医疗信息;也许您只是觉得,拿起您手机的人不该能看到您数字生活的每个角落。按图案分隔的保险库限制了普通解锁时显示的内容,从而加强界面层面的隐私;不过,文件系统检查者仍能看到加密索引的数量。
与其他保险库 App 的比较
许多保险库 App 把安全视为访问控制问题:一个凭证控制一个可见的容器。有些产品加入了假 PIN 码或诱饵模式。这些功能的强弱取决于存储设计,而非营销标签;可见的配置标志或单独的诱饵数据库都可能暴露另一种模式的存在。
单一保险库的问题
单容器设计在直接胁迫面前很脆弱:唯一的凭证一旦交出,其背后的全部内容都会暴露。各产品当前的功能不尽相同,因此请评估其实际的存储和诱饵实现,而不要假定某个竞品采用固定的模式。
徒有其表的诱饵模式
假密码功能可以应对随手检查,但它在取证面前的价值,取决于设备上是否存有可被检测的诱饵标志、第二个数据库或可区分的文件大小。没有公开的设计或审计,单凭一个标签既不能证明否认性很强,也不能证明它失效。
Vaultaire 的方法在架构上截然不同
Vaultaire 把图案分隔直接做进正常的解锁路径。不需要特殊的假 PIN 标志来区分保险库是否为诱饵;每个已设置的图案都指向一个普通的加密保险库。各自的索引文件作为加密容器仍然可见,因此这种架构的优势主要体现在界面和内容隔离上,而不在于在取证中隐藏数量。
结果是一致的体验:没有哪个保险库被标记为“真”或“假”,每个保险库都需要通过各自经过认证的解锁或恢复路径。没有所需的保险库密钥和主密钥,加密内容就无法使用。但加密并不能抹去容器存在这一事实。
常见问题解答
我可以创建多少个保险库?
Vaultaire 没有对可创建的保险库数量设置较小的产品上限。每个有效图案都可以对应一个独立的加密索引。实际限制仍来自存储空间、可用图案空间、订阅功能和设备资源;而且即使 App 不显示保险库选择器,磁盘上的索引文件数量仍可被枚举。
取证检查人员能查出我有多少个保险库吗?
可以,前提是检查者能读取 Vaultaire 的 App 容器。根“vault_index”文件以 64 个槽位为一组,并用随机掩护文件填充;但每个真实保险库还有自己的存储目录,因此可以统计出保险库数量。定位符名称不会泄露图案或可读内容,但 Vaultaire 并不声称保险库数量能在文件系统分析中隐藏。
如果有人知道 Vaultaire 的合理否认功能怎么办?
了解这一设计,并不能得知哪个图案能打开某个加密索引,也无法得知该保险库里有什么。但它确实说明了局限:能检查 App 容器的人可以统计保险库数量,并可借助密钥指纹和 AES-GCM 认证结果离线验证猜测的图案。因此,图案强度和设备安全仍然至关重要。
拥有多个保险库是否会影响存储或性能?
每个保险库占用的存储空间与其中的文件量成正比。无论您有一个还是多个保险库,加密和解密开销都一样。App 只解密与您所画图案对应的保险库,因此其他保险库的存在不会影响性能。
Vaultaire 是否可以通过软件更新强制显示所有保险库?
软件更新以 App 的访问权限运行,可以枚举加密索引文件,也可以改变之后的行为。没有由图案派生的密钥,它仍无法解密未打开的保险库,但软件分发本身属于信任模型的一部分。高风险用户应审查更新内容和独立审计证据。
如果我不小心用已在使用的图案创建保险库,会怎样?
如果您绘制的图案与同一设备上已有的保险库匹配,App 会打开该保险库。在图案、网格大小和设备盐值都相同时,本地密钥派生的结果是确定的,因此 App 会找到同一个索引,而不会创建重复的索引。