Middle
Давом ба маълумоти муҳофизатшудаи корбар дар куҷо нигоҳ медоштед?
sobes.tech AI
Ҷавоб аз AI
Барои нигоҳдории маълумоти муҳофизатшудаи корбар дар iOS, ман ҷойҳои зеринро истифода мебурдам, вобаста ба навъи маълумот ва сатҳи бехатарӣ:
-
Keychain Services:
- Идеалӣ барои нигоҳдории миқдори ками маълумоти махфӣ, монанди паролҳо, токенҳои иҷозатнома, калидҳои рамзгузорӣ.
- Демони системӣ
securitydуправляет keychain ва маълумотҳоро дар шакли рамзгузорӣшуда дар диски нигоҳ медорад. - Муштаранд ба сатҳҳои гуногуни дастрасӣ (масалан, танҳо ҳангоми кушодани дастгоҳ дастрас аст).
- Маълумотҳо автоматӣ тавассути iCloud Keychain ҳамоҳанг карда мешаванд, агар фаъол бошад.
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) // Нахустани сабтҳои мавҷударо тоза мекунад return SecItemAdd(query as CFDictionary, nil) // Сабти навро илова мекунад } -
Encrypted Core Data / Realm:
- Барои нигоҳдории маълумоти сохторӣ, ки ниёз ба рамзгузорӣ дар сатҳи базаи додаҳо доранд.
- Core Data дастгирии васлҳои хориҷӣ барои рамзгузорӣ дорад (масалан, RNCryptor).
- Realm Database дорои рамзгузории дохилӣ барои файлҳои базаи додаҳо мебошад.
- Калиди рамзгузорӣ бояд дар Keychain нигоҳ дошта шавад.
// Намунаи оғозёбии Realm бо рамзгузорӣ import RealmSwift func setupEncryptedRealm() throws { var config = Realm.Configuration() if let key = KeychainHelper.getRealmEncryptionKey() { // Гирифтани калид аз Keychain config.encryptionKey = key } else { // Генерировать новый ключ, сохранять его в Keychain и использовать 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 } -
File Protection APIs:
- Барои рамзгузории файлҳое, ки дар системаи файлҳои барнома нигоҳ дошта мешаванд.
- iOS автоматӣ файлҳоро дар сатҳи системаи файлҳо бо истифода аз калидҳое, ки Secure Enclave идора мекунад, рамзгузорӣ мекунад.
- Мумкин аст режимиҳои гуногуни муҳофизатро (масалан,
complete,completeUnlessOpen,completeUntilFirstUserAuthentication,none) барои назорати дастрасӣ дар асоси ҳолати баста шудани дастгоҳ танзим кард.
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: "Директорияи ҳуҷҷатҳо ёфт нашуд"]) } let fileURL = documentDirectory.appendingPathComponent(fileName) // Танзими режими муҳофизат let options: Data.WritingOptions = .atomicWrite let protectedOptions: Data.WritingOptions = options.union(.writingWithoutOverwriting) // Танҳо мисол, имконоти воқеӣ тавассути хосиятҳои файл ё дар info.plist танзим карда мешаванд try data.write(to: fileURL, options: options) // Танзими хосиятҳои муҳофизати системаи файл (мисол) var attributes: [FileAttributeKey : Any] = [:] attributes[.protectionKey] = FileProtectionType.complete try fileManager.setAttributes(attributes, ofItemAtPath: fileURL.path) } -
Secure Enclave:
- Процессорӣ махсус, ки аз процесси асосӣ ҷудо шудааст ва барои нигоҳдории ва коркарди калидҳои криптографӣ ва маълумотҳо истифода мешавад.
- Барои Touch ID / Face ID ва дигар амалиётҳои ҳассос истифода мешавад.
- Калидҳое, ки дар Secure Enclave нигоҳ дошта мешаванд, ҳеҷ гоҳ аз он берун намераванд ва дастрасӣ ба онҳо барои процесси асосӣ ё системаи оператсионӣ вуҷуд надорад.
- Идеалӣ барои истеҳсол, нигоҳдорӣ ва истифодаи калидҳо барои имзо ё рамзгузорӣ, ки ҳифзи зидди ҳамлаҳои нармафзорӣ муҳим аст.
import CryptoKit import LocalAuthentication func generateAndStoreKeyInSecureEnclave() throws -> P256.Signing.PrivateKey { let accessControl = SecAccessControlCreateWithFlags( kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, // Дастрасӣ бо гузоштани парол [.userPresence], // Талаб кардани тасдиқи корбар (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, // Калид доимӣ мешавад kSecAttrApplicationTag as String: "com.yourapp.signingkey".data(using: .utf8)!, // Теги беназири kSecAttrAccessControl as String: accessControl ] ] var error: Unmanaged<CFError>? guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else { throw error!.takeRetainedValue() as Error } // Мумкин аст калидҳоро аз Secure Enclave бо истифода аз теги барои истифода ба даст оранд return try P256.Signing.PrivateKey(rawRepresentation: privateKeyData) // Мисол, ниёз ба табдил аз SecKey ба Data }
Интихоби ҷой барои нигоҳдорӣ вобаста аст:
- Миқдори маълумот (малаи ё структураҳои маълумот).
- Навъи маълумот (парол, файл, калиди криптографӣ).
- Сатҳи муҳофизат, ки талаб карда мешавад.
- Нақшаи синхронӣ байни дастгоҳҳо (Keychain).
- Нақшаи аутентификатсияи корбар барои дастрасӣ (Secure Enclave, File Protection).