安全架构:完整的技术堆栈
Vaultaire 不依赖于单一算法或单一巧妙技巧。它使用分层加密架构,其中每个组件都有特定的工作,任何一层的失败都不会危及其他层。这是您的私人数据与世界其他数据之间的每一个密码、协议和设计决策。
Vaultaire 使用 AES-256-GCM 对保险库索引、包装密钥、文件头、内容、缩略图和元数据进行认证加密。PBKDF2-HMAC-SHA512 由图案和设备级 Keychain 盐值派生出本地保险库密钥。该保险库密钥包装着一个独立的随机 256 位主密钥,主密钥在 App 进程中通过 CryptoKit 完成文件加密。
加密堆栈
Vaultaire 组合使用多种加密机制,每种机制各司其职。PBKDF2 把人记忆的凭证转换为保险库密钥或恢复密钥。AES-256-GCM 保护索引、包装器、元数据、缩略图和文件内容。随机主密钥让长期有效的文件加密与可更改的图案相互独立。设备锁定时,Keychain 和 iOS 数据保护守护绑定设备的盐值和恢复记录。开发者不持有任何解密密钥,因此无法例行访问保险库明文。
这种分层并非为复杂而复杂,每一层针对不同的攻击面。 AES-256-GCM 将机密性与认证结合在一起,被篡改的密文无法通过验证。 PBKDF2 提高了测试每个图案或短语的成本。有了随机主密钥,更改图案时只需重新包装一个密钥,而不必重新加密每个文件。 Keychain 数据保护 保护本地盐值和恢复记录,同时 App 也明确承认对称加密发生在进程内存中。
这些层共同构成纵深防御架构,但并非每一层都是独立的屏障。猜测的图案可以通过索引文件和 AES-GCM 认证来检验,而已被攻破的解锁设备可以观察 App 进程中的密钥或明文。因此,这套架构取决于凭证熵、PBKDF2 成本、iOS 设备保护、正确的认证加密处理以及 AES 本身的强度。
可以把 Vaultaire 的层级看作一组嵌套的上锁容器。图案派生出的 保险库密钥 打开经过认证的索引。索引中存放着一个已包装的随机 主密钥。该主密钥保护文件和元数据。PBKDF2、AES-GCM、Keychain 和 iOS 数据保护各有不同的特性,但安全性取决于整条链路。
AES-256-GCM:文件加密
Vaultaire 中存储的每张照片、视频和文档都使用 AES-256-GCM 加密,即采用 256 位密钥、以 伽罗瓦/计数器模式运行的高级加密标准。Vaultaire 也用 AES-GCM 加密保险库索引、文件头、缩略图和密钥信封。算法和密钥长度是标准化的;Vaultaire 的安全性仍取决于随机数处理、密钥管理、凭证强度和实现的正确性。
AES-256 中的 “256” 指的是密钥长度(以位为单位)。256 位密钥有 2256 可能值。正确地看待这个数字:大约有 10 个80 原子。如果每个原子都是一台超级计算机,自大爆炸以来一直运行,每秒测试十亿个密钥,那么它们将探索不到百分之一万亿分之一的密钥空间。AES-256不会被暴力破解。不是今天。不是本世纪。不会在星星燃尽之前。
为什么 GCM 模式很重要
AES 是一种分组密码,它以 128 位块的形式加密数据。“mode” 确定这些块的组合方式。GCM(伽罗瓦/计数器模式)提供了 CBC 等简单模式所没有的两项功能:并行加密和内置身份验证。
认证部分至关重要。GCM 为每个加密文件生成一个加密标签。该标签起到防篡改密封的作用。即使密文的一位被修改,无论是恶意行为者还是损坏的磁盘扇区,身份验证标签都将不匹配,解密将失败。您不会得到损坏的数据。您会得到一个明确的信号,表明出现了问题。此属性称为经过身份验证的加密,它可以防止对手修改加密数据以操纵解密输出的一整类攻击。
PBKDF2:密钥派生
Vaultaire 为不同用途派生不同的密钥。图案和设备级 Keychain 盐值经过 600,000 次 PBKDF2-HMAC-SHA512 迭代,生成本地保险库密钥。另一条确定性的图案派生路径生成独立的云备份密钥。规范化后的恢复短语经过 800,000 次 PBKDF2 迭代,生成恢复信封的密钥。输出长度为 256 位,并不会让人记忆的凭证因此拥有 256 位的熵。
PBKDF2 如何保护您的图案
PBKDF2 的核心思想是刻意增加计算量。它对序列化后的图案或规范化后的短语执行数十万次 HMAC-SHA512 迭代。合法用户每次解锁或恢复只需付出一次这个成本,而攻击者要为每个候选值都付出这个成本,但实际猜测速度仍取决于并行硬件和实现方式。
Vaultaire 将图案派生密钥的 PBKDF2 迭代次数设为 600,000 次。这让每次猜测都更昂贵,但严谨的攻击估算必须说明实测的单个候选值耗时和硬件假设。如果每个候选值恰好耗时 1 毫秒,1,000,000,000 次串行猜测大约需要 11.6 天,而不是好几年。256 位的输出不会增加可预测图案的熵。
本地图案派生使用该设备的一个加密随机盐值,以 WhenUnlockedThisDeviceOnly Keychain 项存储。盐值并非机密,由该设备上的所有保险库共用。它能防止为一台设备预先构建的表直接用于盐值不同的另一台设备,但不会迫使攻击者对同一设备上的每个保险库从头开始。
AES-256-GCM:元数据保护
加密文件内容是不够的。文件名、创建日期、缩略图尺寸和库结构都是元数据,元数据可以像数据本身一样揭示信息。名为 “tax-return-2025。pdf” 的文件可以准确告诉攻击者其中的内容,即使内容已加密。时间戳显示您使用保险库的时间。缩略图大小表明某物是照片还是视频。
Vaultaire 用 AES-256-GCM 而不是 ChaCha20 保护这些元数据。文件名和 MIME 类型编码在加密的文件头中。加密的保险库索引包含文件记录、日期、大小信息、存储布局和包装后的主密钥。缩略图数据也用随机主密钥加密。
为什么要对元数据进行认证加密?
元数据既需要机密性,也需要完整性。AES-GCM 为每个加密值生成认证标签,因此 Vaultaire 能拒绝被篡改的文件头、索引、缩略图或信封,而不会接受攻击者控制的明文。这些存储格式有意统一使用一种认证加密结构,而不是宣称具备实现中并不存在的算法多样性。
使用同一种密码算法,并不意味着盲目重复使用相同的密钥或随机数。保险库密钥保护索引并包装随机主密钥;主密钥保护文件数据。CryptoKit 用新的随机数创建经过认证的密封盒,Vaultaire 的流格式则为每个有序数据块派生唯一的随机数。安全保证来自密钥分离、随机数规则和认证,而不是来自另一种元数据密码。
零知识架构
对于任何安全 App,都有一个值得一问的问题:如果其背后的公司遭到黑客攻击、传唤或只是变得恶意,会发生什么?
对于大多数 App 来说,答案是令人不舒服的。它们保存您的数据、密钥或两者。法院命令迫使他们交出它。数据泄露暴露了它。一名流氓员工访问了它。App’的安全性仅与公司’的操作安全性,一样强大,历史表明公司经常遭到破坏。
Vaultaire 不运营任何会接收您的图案、秘密短语、解密密钥或可读保险库内容的账户或存储服务。加密和解密都在设备上的 App 进程中进行。iCloud 备份开启时,App 会把经过认证的密文发送到您的私人 CloudKit 数据库,而不是 Vaultaire 控制的保险库服务。
零知识在实践中意味着什么
如果执法机构传唤 Vaultaire 交出保险库明文,公司并不持有解密所需的图案、恢复短语、保险库密钥、备份密钥或主密钥。加密的 iCloud 记录存放在用户的 CloudKit 私有数据库中。不过在设备上,恢复材料保存在受 Keychain 保护的加密数据库中;CryptoKit 加密或解密已打开的保险库时,对称密钥存在于 App 内存中。
这条服务商边界是一种架构特性,并不代表客户端环境的每个部分都在信任模型之外。Vaultaire 不持有可用于例行恢复保险库的服务器端解密密钥。但发布的 App、iOS、已解锁的设备和加密实现仍会处理可读数据,因此仍需信任它们。
Vaultaire 的服务商边界让正常设计中不存在公司持有的解密密钥,从而减少了 Vaultaire 自身遭入侵时可能泄露的内容。但您仍需信任发布的客户端、iOS、设备状态以及文档所述密钥层级的实现。这些边界应分别评估,而不是合并成一个绝对的承诺。
Keychain 与 App 进程边界
Apple 的 Secure Enclave 可以保护受支持的私钥,也是平台安全架构的一部分,但其公开 API 不能接收任意由 PBKDF2 派生的对称密钥,并在协处理器内执行 Vaultaire 的 AES-GCM 文件操作。因此,Vaultaire 不会把其保险库加密描述为 Secure Enclave AES。
Vaultaire 使用普通的 iOS Keychain 通用密码项,存放随机设备盐值、加密的恢复数据库,以及保护该数据库的随机密钥。这些项使用 WhenUnlockedThisDeviceOnly 可访问性类别。Keychain 和数据保护构成了有意义的设备边界,尤其在手机锁定时,但这种架构不同于不可导出的 Secure Enclave 密钥。
您绘制图案后,CommonCrypto 在 App 进程中派生保险库密钥。随后 CryptoKit 和 Vaultaire 的 CryptoEngine 在该进程中使用对称密钥字节,认证并解密索引、解开主密钥并处理文件。App 锁定时会清除活动状态,但能观察已解锁会话的高权限攻击者,与只拿到锁定设备密文的检查者,所拥有的机会并不相同。
越狱或以其他方式被攻破的系统可以针对图案输入、App 内存、解密后的预览、导出内容或屏幕。Vaultaire 建议使用已更新且未越狱的 iPhone,因为该设计依赖 iOS 进程隔离、Keychain 和数据保护。它并不声称在 root 权限被攻破时,已打开保险库的对称密钥仍无法获取。
每个文件初始化向量
当您使用相同的密钥加密两个相同的文件时,简单的实现会产生相同的密文。这是一个问题。看到两个相同的加密 blob 的攻击者无需解密任何,就知道两个原始文件相同,就知道。在充满照片的保险库中,这种模式分析甚至可以通过加密来揭示信息。
Vaultaire 为每次 AES-256-GCM 密封操作生成新的加密随机数,从而避免产生确定性密文。文件头和文件内容分别密封;大文件使用经过认证的流格式,带有随机的基础随机数,每个有序数据块的随机数各不相同。因此,同一张照片的两个副本不会产生相同的加密结果。
随机数与密文一起存储,并非机密;其安全要求是在同一密钥下保持唯一。Vaultaire 为单次加密向 Apple 的加密随机数生成器请求 96 位随机数,并把基础随机数记录在流头中。碰撞风险取决于同一密钥下的加密次数,因此实现每次都生成新值,而不是把 96 位长度说成固定的 296 分之一的终身保证。
内存管理:清除活动密钥状态
安全软件中的一个常见故障是不再需要敏感数据后将其保留在内存中。加密密钥、派生密码和解密数据在 App 使用完毕后仍可长期保留在 RAM 中。取证工具可以转储设备内存并搜索这些残留物,这种技术称为冷启动攻击或内存转储分析。
Vaultaire 限制活动密钥状态和解密后的界面数据保持可用的时间。App 锁定或会话结束时,代码会执行以下几条清理路径:
- 活动保险库状态已删除。 App 会删除当前的保险库密钥会话,再次显示保险库内容前需要重新解锁。
- 密钥包装器清除拥有的缓冲区。 Vaultaire 的安全字节容器在释放时会覆盖其拥有的缓冲区。
- 缓存的主密钥状态无效。 为已打开索引保存的解密主密钥,会在相应的锁定和缓存重置路径中被丢弃。
- 清除 Vaultaire 可控范围内的解密界面缓存。 清理缩略图和预览可以减少残留的 App 状态,但并不声称能控制 Swift、iOS 或其他进程产生的每个副本。
下次 Vaultaire 从锁定状态打开时,您需要绘制图案,App 重新派生保险库密钥后,才能认证索引并解开主密钥。这是会话清理,并不声称每个临时内存副本都经过可证明的多遍擦除,也不声称销毁了某个 Secure Enclave 密钥引用。崩溃会让 iOS 回收进程,但并非每次意外终止后都能执行清理代码。
常见问题解答
AES-256真的牢不可破吗?
AES-256 是经过深入分析的标准化分组密码。对于正确实现、使用随机 256 位密钥的 AES-256-GCM,目前没有已知的实用攻击,但这并不意味着整个保险库牢不可破。凭证熵、PBKDF2 成本、随机数处理、密钥保管、恢复、设备状态和实现缺陷仍然是攻击途径。
为什么使用PBKDF2进行密钥推导?具有 HMAC-SHA512 的
Vaultaire 通过 CommonCrypto 使用 PBKDF2-HMAC-SHA512:图案迭代 600,000 次,恢复短语迭代 800,000 次。本地图案派生使用一个随机的设备级盐值,存储在 Keychain 中。PBKDF2 提高了每次猜测的成本,但不会增加图案的熵,因此破解时间取决于凭证强度、实测硬件速度和并行能力。
Vaultaire 向其服务器发送哪些数据?
Vaultaire 的服务器永远不会收到您的文件、图案或密钥。该 App 与四类服务通信。加密 iCloud 备份默认开启,将密文存储在您的私人 iCloud 账户中,数据在您的设备上使用 Apple 不持有的密钥加密;您可以关闭它。匿名使用数据和崩溃数据默认发送到 PostHog,您可以在“设置”中关闭。如果您发送反馈,我们的反馈服务会收到您的消息、可选的回复邮箱、您的语言和应用版本。分析开启时,Apple Ads 归因令牌和随机安装 ID 会经过我们的服务发送给 Apple。同步和共享在您使用时通过 Apple CloudKit 进行。
越狱的 iPhone 能否危害我的保险库?
越狱会严重削弱设备边界。Vaultaire 的 AES-GCM 操作通过 CryptoKit 在 App 进程中运行,因此保险库打开时,对称密钥字节存在于 App 内存中。root 级攻击可以针对输入、内存、截屏或解密后的输出。设备锁定时,Keychain 和数据保护仍会增加障碍,但 Vaultaire 并不声称其 AES 密钥隔离在 Secure Enclave 内。
元数据是如何加密的?
Vaultaire 不使用 ChaCha20 加密保险库元数据。文件名、MIME 类型、时间戳、缩略图数据、保险库结构和包装后的主密钥都以 AES-256-GCM 经过认证的密文形式受到保护。统一使用一种认证加密结构,可以让整个存储格式的机密性和完整性检查保持一致。
如果 App 崩溃,我的密钥会怎样?
iOS 会回收已终止的进程,下次启动时必须重新解锁,Vaultaire 才能恢复活动密钥状态。Vaultaire 不会创建会话级的 Secure Enclave AES 引用。虽然其密钥包装器在释放时会清除缓冲区,锁定路径也会丢弃活动状态,但 Swift 和 iOS 无法保证每个临时副本在崩溃前都已被覆盖。