Налаштування Keychain для безпечного зберігання даних в iOS

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Налаштування Keychain для безпечного зберігання даних в iOS
Середній
від 1 дня до 3 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Налаштування Keychain для безпечного збереження даних в iOS

Після оновлення додатка не знаходить токен авторизації — користувач знову видить екран входу. Або гірше: токен зберігся, але доступен іншому додатку того самого вендора без обмежень. Обидві ситуації — наслідок неправильно налаштованого Keychain.

Де саме ломається

Найчастіша помилка — зберігання токенів через UserDefaults. Дані потрапляють в Library/Preferences/*.plist, що входить в iCloud-бекап та доступен через інструменти витягу iTunes backup, як iBackup Viewer. Це не теоретична загроза.

Друга за частотою — використання Keychain без явного kSecAttrAccessible. За замовчуванням kSecAttrAccessibleWhenUnlocked, що розумно, але багато проектів не думають, чи потрібен доступ до даних при заблокованому екрані (для background tasks) або тільки коли пристрій розблокований і лише після першого разблокування після перезавантаження. Це принципово різні threat models.

Третя — відсутність kSecAttrAccessGroup при роботі в App Group. Якщо у вас основний додаток та віджет або розширення, і токен не розшарений явно, розширення не побачить Keychain-запис, хоча Bundle ID з тієї самої групи.

Правильне налаштування через 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, при помилці errSecItemNotFoundSecItemAdd. Не робіть SecItemDelete + SecItemAdd — створює race condition у багатопоточному середовищі.

Біометрична захист через LocalAuthentication

Якщо дані потребують біометричного захисту перед доступом (ключи шифрування, приватні ключі):

let access = SecAccessControlCreateWithFlags(
    nil,
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
    .biometryCurrentSet,  // .userPresence для fallback на пасскод
    nil
)!

Флаг .biometryCurrentSet інвалідує запис при змінах біометрії (новий відбиток, перехід на Face ID) — це намисна поведінка для найтаємніших даних. Для менш критичних .biometryAny зберігає доступ після додавання нових відбитків.

Обгортка і тестованість

Прямі виклики SecItemAdd у production-коді роблять unit-тести неможливими без реального Keychain. Обгорніть у протокол:

protocol KeychainService {
    func save(_ data: Data, for key: String) throws
    func load(for key: String) throws -> Data
    func delete(for key: String) throws
}

У тестах підставляйте InMemoryKeychainService. У production — реалізація через Security framework. Стандартний підхід у Clean Architecture для iOS.

Процес

Аудит поточного коду — шукаємо UserDefaults, NSKeyedArchiver, plaintext у файлах. Далі проектуємо KeychainService під конкретний набір збережених даних, реалізуємо з правильними kSecAttrAccessible, налаштовуємо App Group якщо потрібно розшарювання з розширеннями, покриваємо unit-тестами через мок. Окремо — перевірка поведінки при змінах біометрії та оновленні додатка.

Часові рамки — 1–3 дні. Проста заміна UserDefaults на Keychain для одного типу даних — ближче до дня. Повний аудит + рефакторинг + App Group + біометрія — до трьох.