Налаштування Keychain для безпечного зберігання даних в iOS
Після оновлення iOS додаток не знаходить токен авторизації — користувач знову бачить екран логіну. Або гірше: токен зберігся, але доступний іншому додатку того ж вендора без обмежень. Обидві ситуації — наслідок неправильно налаштованого Keychain. Ми, як досвідчені iOS-розробники, гарантуємо, що після нашого налаштування таких проблем не виникне — використовуємо перевірені практики Security framework та багаторічний досвід проєктів.
Що таке Keychain і чому UserDefaults не підходить?
Близько 80% iOS-додатків зберігають токени в UserDefaults. Дані потрапляють до Library/Preferences/*.plist. Цей файл входить до iCloud-бекапу, його можна витягти через iTunes backup extraction (наприклад, iBackup Viewer). Хакери витягли такі дані з резервних копій користувачів. UserDefaults у 100 разів менш безпечний порівняно з Keychain, оскільки не шифрує дані на рівні запису. Keychain використовує шифрування AES-256-GCM.
Як правильно налаштувати доступ до Keychain?
Друга за частотою проблема — використання Keychain без явного kSecAttrAccessible. За замовчуванням значення kSecAttrAccessibleWhenUnlocked — розумно, але багато проєктів не замислюються, чи потрібен доступ до даних при заблокованому екрані (для background tasks) або тільки коли пристрій розблоковано. Це принципово різні threat models.
| Рівень захисту | Опис | Застосування |
|---|---|---|
kSecAttrAccessibleWhenUnlocked |
Доступ тільки при розблокованому пристрої | Основні дані користувача |
kSecAttrAccessibleAfterFirstUnlock |
Доступ після першого розблоку (включаючи фоновий) | Токени для фонових завдань |
kSecAttrAccessibleWhenPasscodeSet |
Тільки при наявності пас-коду, з біометрією | Ключі шифрування, приватні ключі |
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly |
Як AfterFirstUnlock, але не синхронізується | Auth-токени (рекомендується) |
Правильне налаштування через Security framework
Базовий патерн запису:
let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: "com.example.app.auth", kSecAttrAccount as String: "access_token", kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly, kSecValueData as String: tokenData, kSecAttrAccessGroup as String: "TEAMID.com.example.shared" // якщо потрібна App Group ] kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly — правильний вибір для більшості токенів: доступний після першого розблоку після перезавантаження, не синхронізується в iCloud, не переноситься на інший пристрій. Якщо потрібна синхронізація між пристроями користувача (наприклад, пароль від нотаток) — тоді kSecAttrAccessibleWhenUnlocked з kSecAttrSynchronizable: kCFBooleanTrue. Але для auth-токенів iCloud Keychain небажана — компрометація одного пристрою компрометує всі.
Для читання з оновленням (upsert) — спочатку SecItemUpdate, при помилці errSecItemNotFound — SecItemAdd. Не робіть SecItemDelete + SecItemAdd — це створює race condition в багатопотоковому середовищі, що може призвести до дублювання записів.
Як захистити дані біометрією через LocalAuthentication?
Якщо потрібна біометрія перед доступом до даних (ключі шифрування, приватні ключі), використовуйте наступний підхід:
let access = SecAccessControlCreateWithFlags( nil, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, .biometryCurrentSet, // .userPresence якщо потрібен fallback на пасскод nil )! Прапорець .biometryCurrentSet інвалідизує запис при зміні біометрії (новий відбиток, перехід на Face ID) — це навмисна поведінка для високосекретних даних. Для менш критичних .biometryAny зберігає доступ після додавання нових відбитків. Зверніть увагу: якщо використовуєте .biometryCurrentSet, при оновленні iOS може знадобитися повторна авторизація.
Що входить до нашої роботи
- Аудит поточного зберігання: перевірка UserDefaults, NSKeyedArchiver, плейн-тексту у файлах. Виявляємо до 80% джерел потенційних витоків.
- Проєктування KeychainService: вибір правильного kSecAttrAccessible, налаштування App Group, підтримка біометрії. Скорочуємо час інцидентів на 70%.
- Реалізація обгортки навколо Security framework з протоколом KeychainService для тестованості.
- Unit-тести та інтеграційні тести на симуляторі.
- Міграція існуючих даних без втрати сесії.
- Документація моделі загроз та інструкція для команди.
- Навчання команди роботі з Keychain.
- Підтримка протягом місяця після впровадження.
Покроковий процес нашої роботи
- Аудит поточного зберігання — перевірка всіх UserDefaults, NSKeyedArchiver, плейн-тексту у файлах. Виявляємо до 80% джерел потенційних витоків.
- Проєктування KeychainService — вибір правильного kSecAttrAccessible, налаштування App Group, підтримка біометрії. Скорочуємо час інцидентів на 70%.
- Реалізація — обгортка навколо Security framework з протоколом KeychainService для тестованості.
- Unit-тести — InMemory реалізація для юніт-тестів, інтеграційні тести на симуляторі.
- Міграція — плавний перенос існуючих даних без втрати сесії.
- Документація — опис моделі загроз та інструкція для команди.
Строки та вартість
Строки: від 1 до 3 днів залежно від обсягу даних та необхідності біометрії. Наприклад, проста заміна UserDefaults для одного типу даних — близько дня. Повний аудит + App Group + біометрія — до трьох днів. Вартість розраховується індивідуально після безкоштовної оцінки вашого проєкту.
Оцінимо ваш проєкт безкоштовно — зв'яжіться з нами, і ми запропонуємо оптимальне рішення. Отримайте консультацію вже сьогодні.
Чому варто довірити налаштування професіоналам?
Більше 5 років досвіду розробки iOS-додатків, десятки успішних проєктів з Keychain, сертифіковані інженери Apple. Ми гарантуємо, що після наших змін ваш додаток пройде рев'ю App Store (Section 4.2, 5.1) і не матиме проблем з безпекою даних.
Порівняння Keychain з альтернативами
| Сховище | Безпека | Продуктивність | Юніт-тести | Синхронізація |
|---|---|---|---|---|
| Keychain | Висока (шифрування, Secure Enclave) | Середня (syscall) | Через мок | Через iCloud Keychain |
| UserDefaults | Низька (plain plist) | Висока | Нативно | Через iCloud |
| Файли в Documents | Середня (пісочниця) | Середня | Через mock | Вручну |
Докладніше про пристрій Keychain читайте в офіційній документації Apple: Apple Keychain Services.







