敏感数据不能随便存

Token、密码、密钥这类敏感数据,写进 UserDefaults 或普通沙盒文件并不加密——一旦设备越狱或备份被取走就能读到。iOS 提供了钥匙串这一专门的加密存储,把这类东西放进它,才是正确姿势。

原则:敏感凭证进钥匙串,普通偏好进 UserDefaults。

这篇把钥匙串与数据保护讲清。

钥匙串 Keychain 是什么

钥匙串是系统级的加密数据库,数据用设备密钥加密存储,只有本 App 在解锁状态下能读写。它跨 App 卸载重装仍保留,适合存登录态。存取通过一组 Security 框架的接口。

能进钥匙串的数据
  • 登录令牌会话凭证。
  • 用户密码尽量不自存,交给系统钥匙串。
  • 加密密钥本地数据的密钥。

存取一条钥匙串数据

典型流程:构造查询字典(服务名、账号),调用 SecItemAdd 写入,SecItemCopyMatching 读出,SecItemUpdate 更新,SecItemDelete 删除。

let query: [String: Any] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrAccount as String: "token",
  kSecValueData as String: data
]
SecItemAdd(query as CFDictionary, nil)

读写都包一层小封装,业务代码不用每次写字典。

数据保护等级

写文件时可指定 Data Protection 等级:Complete(设备解锁后才可读)、CompleteUnlessOpen 等。等级决定文件在锁屏、重启后是否可访问。默认高等级即默认加密,选等级就是选解锁门槛。

iOS 安全隐私示意:一把发光钥匙串环绕挂锁与护盾,周围数据块被分层半透明外壳包裹加密
分层加密:数据被外壳层层包裹保护。