Middle
Kullanıcının korunan verilerini nerede saklardınız?
sobes.tech yapay zeka
AI'dan gelen yanıt
iOS'ta kullanıcının korunan verilerini depolamak için, veri türüne ve güvenlik seviyesine bağlı olarak aşağıdaki yerleri kullanırdım:
-
Keychain Hizmetleri:
- Parolalar, yetkilendirme jetonları, şifreleme anahtarları gibi küçük miktarda gizli bilgi saklamak için idealdir.
- Sistem demon
securityd, keychain'i yönetir ve verileri disk üzerinde şifreli olarak saklar. - Farklı erişilebilirlik seviyelerini destekler (örneğin, cihaz kilidi açıkken erişilebilir).
- Veriler, etkinse iCloud Keychain aracılığıyla otomatik olarak senkronize edilir.
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) // Mevcut kaydı sil return SecItemAdd(query as CFDictionary, nil) // Yeni kaydı ekle } -
Şifrelenmiş Çekirdek Veri / Realm:
- Yapılandırılmış verilerin, veritabanı seviyesinde şifrelenmesini gerektiren durumlar için.
- Core Data, üçüncü taraf şifreleme uzantılarını destekler (örneğin, RNCryptor).
- Realm Veritabanı, gömülü dosya şifreleme özelliğine sahiptir.
- Şifreleme anahtarı, Keychain'de saklanmalıdır.
// Şifreleme ile Realm'in başlatılması örneği import RealmSwift func setupEncryptedRealm() throws { var config = Realm.Configuration() if let key = KeychainHelper.getRealmEncryptionKey() { // Keychain'den anahtar al config.encryptionKey = key } else { // Yeni anahtar oluştur, Keychain'e kaydet ve kullan 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 kullanımı } -
Dosya Koruma API'leri:
- Uygulamanın dosya sisteminde saklanan dosyaları şifrelemek için.
- iOS, Secure Enclave tarafından yönetilen anahtarlar kullanılarak dosya seviyesinde otomatik şifreleme yapar.
- Cihaz kilidi durumuna bağlı olarak erişimi kontrol etmek için farklı koruma modları (örneğin,
complete,completeUnlessOpen,completeUntilFirstUserAuthentication,none) ayarlanabilir.
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: "Belge dizini bulunamadı"]) } let fileURL = documentDirectory.appendingPathComponent(fileName) // Koruma modunu ayarla let options: Data.WritingOptions = .atomicWrite let protectedOptions: Data.WritingOptions = options.union(.writingWithoutOverwriting) // Sadece bir örnek, gerçek koruma seçenekleri dosya öznitelikleri veya info.plist ile ayarlanır try data.write(to: fileURL, options: options) // Dosya sistem özniteliklerini ayarla (örnek) var attributes: [FileAttributeKey : Any] = [:] attributes[.protectionKey] = FileProtectionType.complete try fileManager.setAttributes(attributes, ofItemAtPath: fileURL.path) } -
Secure Enclave:
- Ana işlemciden ayrılmış donanım yardımcı işlemcisi, kriptografik anahtarlar ve verilerin saklanması ve işlenmesi için tasarlanmıştır.
- Touch ID / Face ID ve diğer hassas işlemler için kullanılır.
- Secure Enclave'de saklanan anahtarlar asla onun dışına çıkmaz ve ana işlemci veya işletim sistemi tarafından erişilemez.
- İmza veya şifreleme anahtarlarının oluşturulması, saklanması ve kullanılması için idealdir, burada yazılım saldırılarına karşı koruma önemlidir.
import CryptoKit import LocalAuthentication func generateAndStoreKeyInSecureEnclave() throws -> P256.Signing.PrivateKey { let accessControl = SecAccessControlCreateWithFlags( kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, // Parola ayarlandığında erişilebilir [.userPresence], // Kullanıcı doğrulaması gerek (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, // Anahtar kalıcı olacak kSecAttrApplicationTag as String: "com.yourapp.signingkey".data(using: .utf8)!, // Benzersiz etiket kSecAttrAccessControl as String: accessControl ] ] var error: Unmanaged<CFError>? guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else { throw error!.takeRetainedValue() as Error } // Anahtarları kullanmak için etiketle Secure Enclave'den alabilirsiniz return try P256.Signing.PrivateKey(rawRepresentation: privateKeyData) // Örnek, SecKey'den Data'ya dönüşüm gerekebilir }
Depolama yerinin seçimi şu faktörlere bağlıdır:
- Veri boyutu (küçük vs yapılandırılmış veriler).
- Veri tipi (parola vs dosya vs kriptografik anahtar).
- Gerekli koruma seviyesi.
- Cihazlar arasında senkronizasyon ihtiyacı (Keychain).
- Kullanıcı doğrulaması gereksinimi (Secure Enclave, Dosya Koruma).