iOS 安全设计解析(二):数据加密和保护

本系列文章讨论 iOS 在技术层面如何保证用户数据的安全。苹果 2019 年更新了安全设计公开文档,广泛涉及系统安全,加解密,App,网络,付款,Apple ID 等各方面。本文目的不是对它进行翻译,而是提取主要信息并以个人理解希望简明易懂地介绍 iOS 操作系统的安全设计。如果需要更详细的信息,可以阅读原文。了解基本的密码学概念 (例如 AES, RSA, Diffie-Hellman 等) 会对理解本文有很大帮助。

数据加密和保护

移动设备相比台式机或服务器更容易被窃取/丢失,更容易受到物理级别的攻击。所以数据安全有以下几个主要设计目标:

  1. 在硬件被改动的情况下也能保护数据(替换组件/直接读取闪存等)
  2. 对抗离线攻击(物理方式获取闪存内的数据后用更强大的计算设备进行破解)
  3. 对不同的数据提供不同级别的保护(锁屏之后有些数据要保护,有些数据还需要访问)
  4. 需要时能够快速安全清除所有数据
  5. 考虑性能和功耗

硬件安全功能

iOS 设备的硬件提供了几个重要的功能来帮助实现这些目标。

首先 iOS 的所有用户数据文件都是加密存储的。每个文件创建时会生成一个 per-file key,在文件写入闪存时通过硬件用 AES-XTS 加密。per-file key 会进一步被 class key 加密并保存在文件的 metadata 中。class key 用于对文件不同级别的保护,每一个级别对应一个 class key(比如最高级别的 class key 只有在设备解锁状态下才可用)。获取了一个 class key,就可以解密对应级别所有文件的 per-file key,然后用 per-file key 解密这些文件。

所有加密之后的 key,又会进一步被 file system key 加密。file system key 在 iOS 安装时或每次设备数据被清除时生成。file system key 的目的不是保护数据的机密性,而是用于实现快速清除数据。在执行数据清除时,会删除 file system key,使设备上所有文件永久无法解密,实现了快速安全清除。

keys iOS 文件系统加密

文件加密体系:

  1. 文件写入前被 (per-)file key 加密,key 存储在文件的元数据 (metadata) 中。
  2. 文件的 metadata 被 class key 和 file system key 加密。
  3. file system key 和 class-key 都被 hardware key (UID) 保护。
  4. class key 还被 passcode key (基于用户设置的解锁密码) 保护。

这个设计提供了安全性和灵活性,比如用户修改密码,不需要重新加密所有的文件的 key 甚至文件本身,只需要重新加密几个 class key 即可。

Passcode

Passcode 是用户设置的解锁密码。它保护 class key,进而保护所有用户文件。由于 passcode 复杂度相对低 (经常是4或6位数字),容易被穷举攻击。那如何抵抗穷举攻击?

Data Protection classes

设备中我们需要对不同的文件提供不同程度的保护。iOS 上每个文件创建时都会被指定一个级别 (class)。每个级别对应一个 class key。

iOS 通过这些设计实现了文章开始提到的目标。

iOS Keychain 也实现了类似的分级保护机制。但增加了 kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly。这个级别的 class key 在每次 passcode 修改之后都会被清除,并且数据不会被备份。1Password 使用这个级别存储 Touch ID/Face ID 解锁 app 所需要的 key。具体设计细节就不介绍了,可阅读原文。