Middle
İstifadəçinin qorunan məlumatlarını harada saxlayardınız?
sobes.tech Süni İntellekt
AI-dan cavab
iOS-da istifadəçi məlumatlarının qorunan saxlanması üçün, məlumatların növü və təhlükəsizlik səviyyəsindən asılı olaraq aşağıdakı yerlərdən istifadə edərdim:
-
Keychain Services:
- Gizli məlumatların, məsələn, şifrələr, autentifikasiya tokenləri, şifrləmə açarları üçün idealdır.
- Sistem demon
securitydkeychain-i idarə edir və məlumatları diskdə şifrələnmiş şəkildə saxlayır. - Müxtəlif giriş səviyyələrini dəstəkləyir (məsələn, yalnız cihaz bloklandıqda giriş mümkündür).
- Məlumatlar iCloud Keychain vasitəsilə avtomatik sinxronizasiya olunur, əgər aktivdirsə.
import Foundation import Security func savePassword(service: String, account: String, password: String) -> OSStatus { let data = password.data(using: .utf8)! let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: account, kSecValueData as String: data ] SecItemDelete(query as CFDictionary) // Mövcud qeydiyyatı silir return SecItemAdd(query as CFDictionary, nil) // Yeni qeydiyyat əlavə edir } -
Şifrələnmiş Core Data / Realm:
- Strukturlaşdırılmış məlumatların saxlanması üçün, verilənlər bazası səviyyəsində şifrələmə tələb edən.
- Core Data üçün üçüncü tərəf genişləndirmələri (məsələn, RNCryptor) dəstəkləyir.
- Realm Database faylının daxilində şifrələmə mövcuddur.
- Şifrələmə açarı Keychain-də saxlanmalıdır.
// Realm ilə şifrələmə nümunəsi import RealmSwift func setupEncryptedRealm() throws { var config = Realm.Configuration() if let key = KeychainHelper.getRealmEncryptionKey() { // Açarı Keychain-dən alırıq config.encryptionKey = key } else { // Yeni açar yaradırıq, onu Keychain-də saxlayırıq və istifadə edirik let newKey = NSMutableData(length: 64)! _ = SecRandomCopyBytes(kSecRandomDefault, newKey.length, newKey.mutableBytes) KeychainHelper.saveRealmEncryptionKey(key: newKey as Data) config.encryptionKey = newKey as Data } let realm = try Realm(configuration: config) // Realm-dən istifadə } -
Fayl qoruma API-ləri:
- Fayl sistemində saxlanan faylların şifrələnməsi üçün.
- iOS avtomatik olaraq fayl sistemindəki faylları Secure Enclave tərəfindən idarə olunan açarlarla şifrələyir.
- Müxtəlif qoruma rejimləri (məsələn,
complete,completeUnlessOpen,completeUntilFirstUserAuthentication,none) qurmaq mümkündür, bu da cihazın kilid vəziyyətinə görə girişə nəzarət edir.
func saveProtectedDataToFile(data: Data, fileName: String) throws { let fileManager = FileManager.default let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask) guard let documentDirectory = urls.first else { throw NSError(domain: "MyApp", code: 1, userInfo: [NSLocalizedDescriptionKey: "Sənəd qovluğu tapılmadı"]) } let fileURL = documentDirectory.appendingPathComponent(fileName) // Qoruma rejimini qururuq let options: Data.WritingOptions = .atomicWrite let protectedOptions: Data.WritingOptions = options.union(.writingWithoutOverwriting) // Nümunə üçün, real qoruma seçimləri fayl atributları və ya info.plist-də qurulur try data.write(to: fileURL, options: options) // Fayl sisteminin atributlarını qururuq (nümunə) var attributes: [FileAttributeKey : Any] = [:] attributes[.protectionKey] = FileProtectionType.complete try fileManager.setAttributes(attributes, ofItemAtPath: fileURL.path) } -
Secure Enclave:
- Hardware koprotsessor, əsas prosessorundan ayrılmış, kriptografik açarların və məlumatların saxlanması və işlənməsi üçün nəzərdə tutulmuşdur.
- Touch ID / Face ID və digər həssas əməliyyatlar üçün istifadə olunur.
- Secure Enclave-də saxlanılan açarlar heç vaxt onun xaricinə çıxmır və əsas prosessor və ya əməliyyat sisteminə əlçatan deyil.
- İmza və ya şifrləmə üçün açarların yaradılması, saxlanması və istifadəsi üçün idealdır, burada proqram təminatı hücumlarından qorunma vacibdir.
import CryptoKit import LocalAuthentication func generateAndStoreKeyInSecureEnclave() throws -> P256.Signing.PrivateKey { let accessControl = SecAccessControlCreateWithFlags( kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, // Parol qurulmuşsa əlçatan [.userPresence], // İstifadəçi autentifikasiyası tələb olunur (Touch ID/Face ID) nil )! let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom, kSecAttrKeySizeInBits as String: 256, kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave, kSecPrivateKeyAttrs as String: [ kSecAttrIsPermanent as String: true, // Açar daimi olacaq kSecAttrApplicationTag as String: "com.yourapp.signingkey".data(using: .utf8)!, // Unikal etiket kSecAttrAccessControl as String: accessControl ] ] var error: Unmanaged<CFError>? guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else { throw error!.takeRetainedValue() as Error } // Açarları istifadə üçün Secure Enclave-dən əldə etmək mümkündür return try P256.Signing.PrivateKey(rawRepresentation: privateKeyData) // Nümunə, SecKey-dən Data-ya çevirmə tələb olunur }
Seçim yerinə və məlumatların ölçüsünə, növünə, tələb olunan qoruma səviyyəsinə, cihazlar arasında sinxronizasiya ehtiyacına və istifadəçi autentifikasiyasına görə dəyişir.