Ответ
Единственный безопасный способ — использование 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).