Ответ
Keychain — это зашифрованное системное хранилище, предназначенное для безопасного хранения конфиденциальных данных. Это не база данных приложения, а защищенная системная служба.
Что хранят в Keychain:
- Пароли и токены доступа (OAuth, JWT).
- Криптографические ключи и сертификаты.
- Небольшие конфиденциальные данные (номера карт, PIN-коды).
Ключевые преимущества перед UserDefaults/файлами:
- Шифрование: Данные шифруются аппаратно или программно и не хранятся в открытом виде.
- Защита на уровне системы: Доступ контролируется правами процесса, связкой приложения (Team ID) и политиками доступа (например, требование биометрии).
- Сохранность: Данные не удаляются при удалении приложения (если не удалить явно). Это позволяет сохранять логины между переустановками.
- Синхронизация (опционально): Может настраиваться для синхронизации между устройствами пользователя через 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в терминале.