Зачем использовать Keychain для хранения паролей в iOS?

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

Ответ

Keychain — это безопасное зашифрованное хранилище, предоставляемое ОС, предназначенное специально для критичных данных (пароли, ключи, сертификаты). В отличие от UserDefaults или файлов, он обеспечивает аппаратный и системный уровень защиты.

Пример сохранения пароля:

import Security

func savePassword(_ password: String, for account: String) -> OSStatus {
    let passwordData = Data(password.utf8)

    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecAttrService as String: "com.yourapp.service",
        kSecValueData as String: passwordData,
        kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly // Уровень защиты
    ]

    // Сначала удаляем старую запись
    SecItemDelete(query as CFDictionary)
    // Добавляем новую
    return SecItemAdd(query as CFDictionary, nil)
}

Ключевые преимущества:

  1. Аппаратное шифрование: Данные шифруются с использованием Secure Enclave на поддерживаемых устройствах.
  2. Защита от извлечения: Данные недоступны даже при физическом доступе к файловой системе (джейлбрейк).
  3. Интеграция с биометрией: Легко настроить доступ через Touch ID/Face ID (kSecAccessControlBiometryCurrentSet).
  4. Синхронизация (опционально): Может синхронизироваться через iCloud Keychain между доверенными устройствами пользователя.
  5. Сохранность: Данные не удаляются при удалении приложения (в отличие от sandbox).