Middle
Колдонучунун корголгон маалыматтарын кайда сактайсыз?
sobes.tech AI
AIден жооп
iOS-та колдонуучунын корголгон маалыматтарын сактоо үчүн мен төмөнкү жерлерди колдончумун, маалыматтын түрүнө жана коопсуздук деңгээлине жараша:
-
Keychain Services:
- Кичинекей көлөмдөгү сырдуу маалыматтарды сактоо үчүн идеалдуу, мисалы, паролдор, авторизация токендери, шифрлөө ачкычтары.
- Системдик демон
securitydkeychainти башкарат жана маалыматтарды дискте шифрлеп сактайт. - Ар кандай жеткиликтүүлүк деңгээлдерин колдойт (мисалы, түзмөк ачылганда гана жеткиликтүү).
- Маалыматтар 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 базасы файл шифрлөөсү менен келет.
- Шифрлөө ачкычы Keychainте сакталуусу керек.
// Realm шифрлөөсүнүн мисалы import RealmSwift func setupEncryptedRealm() throws { var config = Realm.Configuration() if let key = KeychainHelper.getRealmEncryptionKey() { // Keychainтен ачкычты алуу config.encryptionKey = key } else { // Жаңы ачкычты түзүү, сактоо жана колдонуу 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)!, // Unique тег 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-га айландыруу талап кылынат }
Тандоо:
- Маалыматтын көлөмүнө (кичинекей vs структураланган)
- Маалыматтын түрүнө (пароль vs файл vs криптографикалык ачкыч)
- Коргоо деңгээлине
- Синхрондоштуруу талаптарына (Keychain)
- Колдонуучунун аныктоосуна (Secure Enclave, File Protection) жараша болот.