Sobes.tech
Junior

Was ist der Unterschied zwischen Keychain und User Defaults?

sobes.tech KI

Antwort von AI

UserDefaults wird verwendet, um kleine nicht vertrauliche Daten zu speichern, wie z.B. Benutzereinstellungen oder den Zustand der Anwendung. Die Daten werden als Schlüssel-Wert-Paare in einer .plist-Datei gespeichert und sind für alle Teile der Anwendung zugänglich. UserDefaults verschlüsselt die Daten nicht und ist nicht geeignet für die Speicherung kritischer Informationen.

Keychain wird verwendet, um vertrauliche Daten sicher zu speichern, wie Passwörter, Zertifikate, Tokens und andere sensible Informationen. Die Daten werden verschlüsselt und in einem spezialisierten Speicher abgelegt, der nur für die Anwendung zugänglich ist, die sie gespeichert hat. Keychain wird auf Betriebssystemebene unterstützt und bietet einen hohen Schutzgrad.

Wichtige Unterschiede:

Merkmal UserDefaults Keychain
Zweck Speicherung nicht vertraulicher Einstellungen Speicherung vertraulicher Daten (Passwörter, Tokens)
Sicherheit Keine integrierte Verschlüsselung Daten werden verschlüsselt
Zugriff Für alle Teile der Anwendung zugänglich Nur für die Anwendung zugänglich, die sie gespeichert hat
Datenmenge Für kleine Datenmengen geeignet Für kleine Mengen vertraulicher Daten geeignet
Implementierung Einfache API, Speicherung in .plist-Datei Komplexere API, Speicherung im Systemspeicher

Beispiel für die Verwendung von UserDefaults:

// Wert speichern
UserDefaults.standard.set("dark", forKey: "theme")

// Wert abrufen
let theme = UserDefaults.standard.string(forKey: "theme")

Beispiel für die Verwendung von Keychain (erfordert Arbeit mit der SecItem API oder Wrappers):

// Beispiel zum Hinzufügen eines Passworts (vereinfachte Version, erfordert Fehlerbehandlung und zusätzliche Parameter)
let password = "mySecretPassword".data(using: .utf8)!
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
    kSecValueData as String: password
]

let statusAdd = SecItemAdd(query as CFDictionary, nil)
// Status behandeln

// Beispiel zum Abrufen des Passworts (vereinfachte Version, erfordert Fehlerbehandlung)
let queryGet: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "myAccount",
    kSecReturnData as String: kCFBooleanTrue!,
    kSecMatchLimit as String: kSecMatchLimitOne
]

var item: CFTypeRef?
let statusGet = SecItemCopyMatching(queryGet as CFDictionary, &item)

if statusGet == errSecSuccess {
    let retrievedData = item as! Data
    let retrievedPassword = String(data: retrievedData, encoding: .utf8)
    // Verwendung des Passworts
}