Ответ
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)
}
Ключевые преимущества:
- Аппаратное шифрование: Данные шифруются с использованием Secure Enclave на поддерживаемых устройствах.
- Защита от извлечения: Данные недоступны даже при физическом доступе к файловой системе (джейлбрейк).
- Интеграция с биометрией: Легко настроить доступ через Touch ID/Face ID (
kSecAccessControlBiometryCurrentSet). - Синхронизация (опционально): Может синхронизироваться через iCloud Keychain между доверенными устройствами пользователя.
- Сохранность: Данные не удаляются при удалении приложения (в отличие от sandbox).