Sobes.tech
Middle

Waar zou je de beschermde gegevens van de gebruiker opslaan?

sobes.tech AI

Antwoord van AI

Om de beveiligde gebruikersgegevens op iOS op te slaan, zou ik de volgende locaties gebruiken, afhankelijk van het type gegevens en het beveiligingsniveau:

  1. Keychain Services:

    • Ideaal voor het opslaan van kleine hoeveelheden vertrouwelijke informatie, zoals wachtwoorden, autorisatietokens, encryptiesleutels.
    • Het systeemproces securityd beheert de keychain en slaat gegevens versleuteld op de schijf op.
    • Ondersteunt verschillende toegankelijkheidsniveaus (bijvoorbeeld alleen toegankelijk wanneer het apparaat is ontgrendeld).
    • Gegevens worden automatisch gesynchroniseerd via iCloud Keychain, indien ingeschakeld.
    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) // Verwijdert bestaande invoer
        return SecItemAdd(query as CFDictionary, nil) // Voegt nieuwe invoer toe
    }
    
  2. Versleutelde Core Data / Realm:

    • Voor het opslaan van gestructureerde gegevens die versleuteling op databasetniveau vereisen.
    • Core Data ondersteunt externe encryptie-uitbreidingen (bijvoorbeeld RNCryptor).
    • Realm Database heeft ingebouwde versleuteling van het databasebestand.
    • De encryptiesleutel moet worden opgeslagen in de Keychain.
    // Voorbeeld van het initialiseren van Realm met encryptie
    import RealmSwift
    
    func setupEncryptedRealm() throws {
        var config = Realm.Configuration()
        if let key = KeychainHelper.getRealmEncryptionKey() { // Haal de sleutel uit de Keychain
            config.encryptionKey = key
        } else {
            // Genereer een nieuwe sleutel, sla deze op in de Keychain en gebruik deze
            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)
        // Gebruik Realm
    }
    
  3. Bestandsbeveiligings-API's:

    • Voor het versleutelen van bestanden die in het bestandssysteem van de app worden opgeslagen.
    • iOS versleutelt automatisch bestanden op bestandssysteemniveau met behulp van sleutels beheerd door Secure Enclave.
    • Verschillende beveiligingsmodi kunnen worden ingesteld (bijvoorbeeld complete, completeUnlessOpen, completeUntilFirstUserAuthentication, none) om de toegang te regelen afhankelijk van de vergrendelingsstatus van het apparaat.
    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: "Documentenmap niet gevonden"]) }
    
        let fileURL = documentDirectory.appendingPathComponent(fileName)
    
        // Stel de beveiligingsmodus in
        let options: Data.WritingOptions = .atomicWrite
        let protectedOptions: Data.WritingOptions = options.union(.writingWithoutOverwriting) // Bijvoorbeeld, echte beveiligingsopties worden ingesteld via bestandseigenschappen of in info.plist
    
        try data.write(to: fileURL, options: options)
    
        // Stel bestandssysteemattributen in (voorbeeld)
        var attributes: [FileAttributeKey : Any] = [:]
        attributes[.protectionKey] = FileProtectionType.complete
        try fileManager.setAttributes(attributes, ofItemAtPath: fileURL.path)
    }
    
  4. Secure Enclave:

    • Hardwarematige coproces, gescheiden van de hoofdprocessor, bedoeld voor het opslaan en verwerken van cryptografische sleutels en gegevens.
    • Gebruikt voor Touch ID / Face ID en andere gevoelige operaties.
    • Sleutels opgeslagen in de Secure Enclave verlaten deze nooit en zijn niet toegankelijk voor de hoofdprocessor of het besturingssysteem.
    • Ideaal voor het genereren, opslaan en gebruiken van sleutels voor ondertekening of encryptie, waar bescherming tegen softwareaanvallen belangrijk is.
    import CryptoKit
    import LocalAuthentication
    
    func generateAndStoreKeyInSecureEnclave() throws -> P256.Signing.PrivateKey {
        let accessControl = SecAccessControlCreateWithFlags(
            kCFAllocatorDefault,
            kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, // Toegankelijk bij ingesteld wachtwoord
            [.userPresence], // Gebruikersauthenticatie vereist (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, // Sleutel is permanent
                kSecAttrApplicationTag as String: "com.yourapp.signingkey".data(using: .utf8)!, // Unieke tag
                kSecAttrAccessControl as String: accessControl
            ]
        ]
    
        var error: Unmanaged<CFError>?
        guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
            throw error!.takeRetainedValue() as Error
        }
    
        // Sleutels uit Secure Enclave kunnen worden verkregen via de tag voor gebruik
        return try P256.Signing.PrivateKey(rawRepresentation: privateKeyData) // Voorbeeld, conversie van SecKey naar Data vereist
    }
    

De keuze van opslagplaats hangt af van:

  • De grootte van de gegevens (kleine hoeveelheid vs gestructureerde gegevens).
  • Het type gegevens (wachtwoord vs bestand vs cryptografische sleutel).
  • Het vereiste beveiligingsniveau.
  • De noodzaak tot synchronisatie tussen apparaten (Keychain).
  • De behoefte aan gebruikersauthenticatie voor toegang (Secure Enclave, File Protection).