Sobes.tech
Middle

Колдонучунун корголгон маалыматтарын кайда сактайсыз?

sobes.tech AI

AIден жооп

iOS-та колдонуучунын корголгон маалыматтарын сактоо үчүн мен төмөнкү жерлерди колдончумун, маалыматтын түрүнө жана коопсуздук деңгээлине жараша:

  1. 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) // Жаңы жазууларды кошуу
    }
    
  2. 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 колдонуу
    }
    
  3. 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)
    }
    
  4. 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) жараша болот.