Was ist KeychainAccess und warum wird es benötigt?
KeychainAccess ist eine leichte, aber leistungsstarke Bibliothek für Swift, die eine bequeme und typsichere Schnittstelle für die Arbeit mit den Keychain Services von Apple bietet. Die Keychain ist ein geschützter Speicher, der in iOS, macOS, watchOS und tvOS integriert ist und für die Aufbewahrung vertraulicher Daten wie Passwörter, Verschlüsselungsschlüssel, Authentifizierungstoken, Kreditkartennummern und andere geheime Informationen entwickelt wurde.
Ohne Bibliotheken ist die Arbeit mit der Keychain über die native C-Schnittstelle (Funktionen wie SecItemAdd, SecItemCopyMatching, SecItemUpdate, SecItemDelete) äußerst umständlich, erfordert viel Boilerplate-Code und ist fehleranfällig. KeychainAccess löst dieses Problem, indem es Folgendes bietet:
- Einfache Swift-Syntax: Arbeit über Eigenschaften (get/set) und Methoden mit verständlichen Namen.
- Typsicherheit: Daten werden automatisch in
String,Dataoder benutzerdefinierte Typen, dieCodableimplementieren, konvertiert. - Flexibilität: Unterstützung verschiedener Zugriffsstufen (App-Zugriff, nach Geräteentsperrung, mit Biometrie), Arbeit mit Keychain-Gruppen und iCloud-Synchronisation.
- Sicherheit standardmäßig: Die Bibliothek verwendet die von Apple festgelegten Best Practices für Sicherheit.
Die Bibliothek eignet sich ideal zum Speichern von OAuth-Tokens, Benutzerpasswörtern, API-Schlüsseln, Seed-Phrasen von Krypto-Wallets und allen anderen Daten, die nicht in UserDefaults oder im Dateisystem im Klartext gespeichert werden dürfen.
Installation von KeychainAccess
KeychainAccess wird nicht über pip (Python) oder npm (JavaScript) installiert. Es ist eine native Bibliothek für das Apple-Ökosystem. Die wichtigsten Installationsmethoden sind:
1. Swift Package Manager (SPM) – Empfohlene Methode
In Xcode: File → Add Packages... → fügen Sie die Repository-URL ein:
https://github.com/kishikawakatsumi/KeychainAccess.git
Wählen Sie die Version (normalerweise "Up to Next Major" mit der neuesten stabilen Version) und fügen Sie das Paket zu Ihrem Target hinzu.
Oder fügen Sie die Abhängigkeit in Ihrer Package.swift-Datei hinzu:
// swift-tools-version:5.7
import PackageDescription
let package = Package(
name: "MyPackage",
dependencies: [
.package(url: "https://github.com/kishikawakatsumi/KeychainAccess.git", from: "4.2.2")
],
targets: [
.target(
name: "MyPackage",
dependencies: ["KeychainAccess"]),
]
)
2. CocoaPods
Fügen Sie die folgende Zeile zu Ihrem Podfile hinzu:
pod 'KeychainAccess'
Führen Sie dann pod install aus.
3. Carthage
Fügen Sie in Ihrem Cartfile hinzu:
github "kishikawakatsumi/KeychainAccess"
Führen Sie dann carthage update aus und fügen Sie das Framework zu Ihrem Projekt hinzu.
Schnellstart mit KeychainAccess
Nach der Installation importieren Sie die Bibliothek: import KeychainAccess
Das einfachste Beispiel ist das Speichern und Lesen eines Strings:
import KeychainAccess
// Erstellen einer Instanz für die App-Keychain
let keychain = Keychain(service: "com.example.myapp")
// Wert speichern
try keychain.set("my_secret_password", key: "user_password")
// Wert lesen
if let password = try keychain.get("user_password") {
print("Gefundenes Passwort: \(password)")
} else {
print("Passwort nicht gefunden")
}
// Wert löschen
try keychain.remove("user_password")
Dieser Code führt drei grundlegende Operationen aus: Schreiben, Lesen und Löschen. Beachten Sie die Fehlerbehandlung mit try – Operationen mit der Keychain können Ausnahmen auslösen (z. B. bei Zugriffsproblemen oder fehlenden Berechtigungen).
Wichtige Methoden und Funktionen von KeychainAccess
Betrachten wir die wichtigsten Methoden im Detail:
Speichern von Daten
Die set()-Methode speichert einen Wert unter einem bestimmten Schlüssel:
try keychain.set("mein_passwort", key: "login_pw")
try keychain.set(data, key: "mein_schluessel") // für Data-Typ
Lesen von Daten
Die get()-Methode liest einen Wert für einen bestimmten Schlüssel:
if let wert = try keychain.get("login_pw") {
print(wert)
}
if let daten = try keychain.getData("mein_schluessel") {
print(daten)
}
Löschen von Daten
Die remove()-Methode löscht einen Eintrag:
try keychain.remove("login_pw")
Alle Einträge löschen
Mit removeAll() können Sie alle Einträge in der Keychain für diesen Service löschen:
try keychain.removeAll()
Zugriffsstufen festlegen
KeychainAccess unterstützt verschiedene Zugriffsstufen über die accessibility-Eigenschaft:
let keychain = Keychain(service: "com.example.myapp")
.accessibility(.whenUnlockedThisDeviceOnly) // Nur wenn Gerät entsperrt ist, nicht über iCloud synchronisiert
Weitere Optionen sind .whenPasscodeSetThisDeviceOnly (erfordert einen Gerätecode) und .afterFirstUnlock (Zugriff auch im Hintergrund).
Biometrische Authentifizierung
Für zusätzliche Sicherheit können Sie Face ID oder Touch ID anfordern:
let keychain = Keychain(service: "com.example.myapp")
.accessibility(.whenUnlockedThisDeviceOnly)
.authenticationPolicy(.biometryCurrentSetOrDevicePasscode)
// Beim Lesen wird der Benutzer zur Authentifizierung aufgefordert
if let passwort = try keychain.get("login_pw") {
print("Authentifiziert und Passwort gelesen: \(passwort)")
}
Praktische Beispiele
Beispiel 1: OAuth-Token speichern
import KeychainAccess
class TokenManager {
private let keychain = Keychain(service: "com.example.myapp.tokens")
func saveToken(_ token: String, for key: String) throws {
try keychain.set(token, key: key)
}
func getToken(for key: String) throws -> String? {
return try keychain.get(key)
}
func deleteToken(for key: String) throws {
try keychain.remove(key)
}
}
Beispiel 2: Benutzerpasswort speichern und abrufen
import KeychainAccess
let keychain = Keychain(service: "com.example.myapp.login")
// Passwort speichern
try keychain.set("sicheres_passwort_123", key: "benutzername@example.com")
// Passwort abrufen
if let passwort = try keychain.get("benutzername@example.com") {
print("Passwort gefunden: \(passwort)")
} else {
print("Kein Passwort gespeichert")
}
Fehlerbehandlung
Da Keychain-Operationen Fehler auslösen können, ist eine ordnungsgemäße Fehlerbehandlung wichtig:
do {
try keychain.set("mein_wert", key: "mein_schluessel")
} catch let error {
print("Fehler beim Speichern in der Keychain: \(error.localizedDescription)")
}
Fazit
KeychainAccess ist eine unverzichtbare Bibliothek für jeden Swift-Entwickler, der sichere Daten speichern muss. Sie vereinfacht die Arbeit mit der Apple Keychain erheblich und bietet eine typsichere, moderne API. Mit den gezeigten Methoden und Beispielen können Sie sofort loslegen und Ihre sensiblen Daten sicher verwalten.
Auch in der Bibliothek
gRPC für JavaScript (Node.js): Bibliotheken und Codebeispiele
Objektserialisierung in TypeScript: Ein vollständiger Leitfaden
JWT-Tokens in Go (Golang): Erstellung und Überprüfung mit Beispielen