Ответ
Единственный безопасный способ — использование Keychain Services. Это зашифрованное системное хранилище, защищенное даже на устройствах с jailbreak.
Пример сохранения пароля:
import Security
let password = "secret123".data(using: .utf8)!
let query: [CFString: Any] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: "userAccount",
kSecValueData: password
]
let status = SecItemAdd(query as CFDictionary, nil)
// Проверяем статус: status == errSecSuccess
Практические подходы:
- Использование оберток:
KeychainAccessили собственный безопасный враппер. - Для работы с биометрией (Face ID/Touch ID) —
LAContextи Secure Enclave. - Никогда не хранить в
UserDefaults,.plist-файлах, базе данных или в виде строк в коде.
Правило: Любые долгосрочные секреты — только в Keychain. Временные данные (например, токен сессии) можно держать в памяти (RAM).
Ответ 18+ 🔞
А, слушай, смотри, вот тебе насущный вопрос: куда, блядь, деть пароль в приложении, чтобы его не спиздили? Так вот, единственный нормальный способ — это Keychain Services, ёпта. Это системное хранилище, зашифрованное так, что даже если девайс взломали (jailbreak, блядь), до твоих данных нихуя не доберутся. Не то что эти твои UserDefaults, которые любой распиздяй прочитает.
Вот, смотри, как это выглядит, примерчик сохранения:
import Security
let password = "secret123".data(using: .utf8)!
let query: [CFString: Any] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: "userAccount",
kSecValueData: password
]
let status = SecItemAdd(query as CFDictionary, nil)
// Проверяем статус: status == errSecSuccess
Видишь? Никакой магии, обычный системный вызов. Статус проверил — и спи спокойно, пароль под защитой.
А теперь, блядь, практические советы, чтобы не накосячить:
- Не изобретай велосипед, ёпта. Бери готовые обёртки, типа
KeychainAccess. Или, если уж совсем охуевший, пиши свою, но так, чтобы она была безопасной, а не простоUserDefaultsпод капотом, блядь. - Хочешь биометрию (Face ID / Touch ID)? Пожалуйста! Используй
LAContextи Secure Enclave — это специальная железяка в процессоре для таких дел. - И главное, запомни раз и нахуй: НИКОГДА не храни секреты в
UserDefaults, в.plist-файлах, в базе данных или, ядрёна вошь, в виде строк прямо в коде! Это как оставить ключи от квартиры под ковриком — первый же мудак найдёт.
Итоговое правило, простое, как три копейки: Все долгосрочные секреты (пароли, пин-коды) — только в Keychain, и точка. Временную хуйню, типа токена сессии, можно в оперативке (RAM) подержать, пока приложение живо. Всё, вопрос закрыт.