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:
-
Keychain Services:
- Ideaal voor het opslaan van kleine hoeveelheden vertrouwelijke informatie, zoals wachtwoorden, autorisatietokens, encryptiesleutels.
- Het systeemproces
securitydbeheert 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 } -
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 } -
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) } -
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).