Что такое Keychain в iOS/macOS и для чего он используется?

«Что такое Keychain в iOS/macOS и для чего он используется?» — вопрос из категории Swift Core, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Keychain — это зашифрованное системное хранилище, предназначенное для безопасного хранения конфиденциальных данных. Это не база данных приложения, а защищенная системная служба.

Что хранят в Keychain:

  • Пароли и токены доступа (OAuth, JWT).
  • Криптографические ключи и сертификаты.
  • Небольшие конфиденциальные данные (номера карт, PIN-коды).

Ключевые преимущества перед UserDefaults/файлами:

  1. Шифрование: Данные шифруются аппаратно или программно и не хранятся в открытом виде.
  2. Защита на уровне системы: Доступ контролируется правами процесса, связкой приложения (Team ID) и политиками доступа (например, требование биометрии).
  3. Сохранность: Данные не удаляются при удалении приложения (если не удалить явно). Это позволяет сохранять логины между переустановками.
  4. Синхронизация (опционально): Может настраиваться для синхронизации между устройствами пользователя через iCloud Keychain.

Базовый пример сохранения пароля (используя C-API Security.framework):

let password = "mySecretPassword".data(using: .utf8)!
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "userAccount", // Ключ (логин)
    kSecAttrService as String: "com.yourapp.service", // Идентификатор службы
    kSecValueData as String: password // Сами данные
]
let status = SecItemAdd(query as CFDictionary, nil)
// Проверяем status == errSecSuccess

Особенности и ограничения:

  • Сложный низкоуровневый API: Работа через Security.framework (C-API) громоздка и подвержена ошибкам. Рекомендуется использовать проверенные обертки: KeychainAccess, SAMKeychain или собственную абстракцию.
  • Не для больших данных: Предназначен для ключей и небольших бинарных данных, не для файлов или кэша.
  • Политики доступа: Можно настроить доступ только при разблокированном устройстве или с обязательной аутентификацией через Face ID/Touch ID (kSecAccessControlBiometryCurrentSet).
  • Отладка: Просмотреть содержимое Keychain можно через приложение Keychain Access на macOS или security в терминале.