Sobes.tech
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:

  1. 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 securityd keychain-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
    }
    
  2. Ş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ə
    }
    
  3. 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)
    }
    
  4. 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.