Как и где безопасно хранить секретные изображения (или другие бинарные данные) в iOS-приложении?

«Как и где безопасно хранить секретные изображения (или другие бинарные данные) в iOS-приложении?» — вопрос из категории Базы данных, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для хранения конфиденциальных данных, таких как изображения, необходимо использовать защищенные API iOS. Никогда не храните секреты в UserDefaults, plist-файлах или в открытом виде в директориях Documents или Caches.

Рекомендуемые подходы:

  1. Keychain Services: Лучший выбор для небольших данных (практический лимит ~4KB). Данные шифруются аппаратным ключом и защищены на уровне системы.

    // Сохранение данных изображения в Keychain
    let imageData = UIImage(named: "secret")!.pngData()!
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: "com.yourapp.secretImage",
        kSecValueData as String: imageData,
        kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly // Строгий атрибут доступа
    ]
    SecItemAdd(query as CFDictionary, nil)
  2. Шифрование + Файловая система: Для больших файлов. Зашифруйте данные с помощью CryptoKit перед записью в защищенную директорию.

    import CryptoKit
    // Генерация/хранение ключа — в Keychain!
    let key = SymmetricKey(size: .bits256)
    let imageData = try Data(contentsOf: imageURL)
    let sealedBox = try AES.GCM.seal(imageData, using: key)
    try sealedBox.combined?.write(to: encryptedFileURL)
  3. Secure Enclave: Максимальный уровень защиты для криптографических ключей (например, ключа для расшифровки файла). Доступно только на устройствах с FaceID/TouchID. Используется для операций с ключами, но не для хранения самих изображений.

Атрибуты доступа Keychain (kSecAttrAccessible): Используйте kSecAttrAccessibleWhenUnlockedThisDeviceOnly, чтобы данные были доступны только после разблокировки устройства и не копировались в резервные копии iCloud.