Ответ
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).
Ответ 18+ 🔞
Вот же ж, ну что за дичь постоянно происходит! Люди как будто с луны свалились — пароли в UserDefaults пихают, потом орут, что их аккаунты угнали. Да вы что, блядь, с ума все посходили? Это же примерно как ключи от квартиры под ковриком оставлять, а потом удивляться, почему телевизора нет!
Слушай сюда, раз и навсегда: Keychain — это, блядь, сейф встроенный в систему, бронебойный, ебаный, с кодовым замком и сигнализацией. Не для твоих кривых скриншотов он, а для самого ценного: паролей, ключей, сертификатов. Там всё зашифровано на аппаратном уровне, даже если какой-то пидорас с джейлбрейком файловую систему обшарит — нихуя он не увидит, только сопли пузырями пустит.
Смотри, как этим сейфом пользоваться, на примере пароля. Главное — не выёбывайся и делай по инструкции:
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)
}
Видишь эту строчку kSecAttrAccessibleWhenUnlockedThisDeviceOnly? Это, блядь, уровень паранойи. «Только когда разблокировано и только на этом устройстве». Хочешь через iCloud гонять — меняй, но знай, на что идешь.
А теперь, сука, почему это овердохуище круче всего:
- Железо рулит. Шифрует не софт твой кривой, а сам чип (Secure Enclave), это, блядь, не взломать.
- От джейлбрейка защита. Эти мартышкодятлы с root-доступом могут хоть танцевать лезгинку вокруг файловой системы — ключи им не светят.
- Палец/рожа вместо пароля. Одна строчка — и доступ по Face ID. Красота, ёпта!
- Синхронизация (если попросишь). Может сам между айфоном и макбуком твоим пароли перекинуть, по защищенному каналу.
- Переживёт твоё приложение. Удалишь прогу — пароли в сейфе останутся. Это и хорошо, и страшно: не засри там всё подряд!
Короче, если хранишь что-то ценнее, чем настройку фона экрана — твоё место в Keychain. Всё остальное — непрофессиональная хуйня и распиздяйство.