Geheimnisse im Keychain speichern
Speichern und rufen Sie Zugangsdaten sicher ab.
Geheimnisse im Keychain speichern ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum die Keychain
Passwörter, Tokens und Schlüssel dürfen niemals in UserDefaults oder einfachen Dateien gespeichert werden – diese lassen sich leicht auslesen. Die Keychain ist eine verschlüsselte, vom Betriebssystem verwaltete Datenbank für kleine Geheimnisse, die durch die Hardware und den Gerätecode des Benutzers geschützt ist. Sie ist der einzig richtige Ort für Zugangsdaten.
import Security
// Keychain stores secrets encrypted at rest,
// survives app updates, and gates access by policy.Elemente sind Dictionaries
Die Keychain-Services-API basiert auf C: Sie beschreiben ein Element mit einem [String: Any]-Abfrage-Dictionary, das Schlüssel in Form von kSec...-Konstanten verwendet. Dieselbe Dictionary-Struktur wird für das Hinzufügen, Suchen, Aktualisieren und Löschen wiederverwendet.
import Security
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "user@example.com",
kSecAttrService as String: "com.example.app"
]
_ = queryElementklassen
Der Schlüssel kSecClass legt den Elementtyp fest. kSecClassGenericPassword umfasst App-Tokens und Geheimnisse; kSecClassInternetPassword speichert Server-Zugangsdaten mit Host- und Protokollattributen. Für die meisten App-Geheimnisse wird der generische Passworttyp verwendet.
import Security
// kSecClassGenericPassword -> tokens, API keys
// kSecClassInternetPassword -> server logins
// kSecClassKey / Certificate -> crypto material
let cls = kSecClassGenericPassword
_ = clsEin Element hinzufügen
SecItemAdd fügt ein neues Element ein. Sie geben die Daten unter kSecValueData als Data sowie Attribute an, die das Element identifizieren. Die Methode gibt einen OSStatus zurück – errSecSuccess bedeutet, dass der Vorgang erfolgreich war.
import Security
func save(_ token: String, account: String) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecValueData as String: Data(token.utf8)
]
return SecItemAdd(query as CFDictionary, nil)
== errSecSuccess
}Duplikate behandeln
Beim Hinzufügen eines Elements, dessen identifizierende Attribute bereits vorhanden sind, wird errSecDuplicateItem zurückgegeben. Ein robuster Speichervorgang versucht zunächst SecItemAdd und verwendet bei einem Duplikat ersatzweise SecItemUpdate – ein Upsert-Muster.
import Security
func upsert(_ data: Data, account: String) -> Bool {
let base: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account]
var add = base
add[kSecValueData as String] = data
let status = SecItemAdd(add as CFDictionary, nil)
if status == errSecDuplicateItem {
return SecItemUpdate(base as CFDictionary,
[kSecValueData as String: data] as CFDictionary)
== errSecSuccess
}
return status == errSecSuccess
}Ein Item auslesen
SecItemCopyMatching führt die Suche durch. Um die geheimen Bytes abzurufen, müssen Sie kSecReturnData auf true und kSecMatchLimit auf kSecMatchLimitOne setzen. Das Ergebnis wird über einen Out-Parameter als CFTypeRef zurückgegeben.
import Security
func load(account: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne]
var result: CFTypeRef?
let status = SecItemCopyMatching(
query as CFDictionary, &result)
guard status == errSecSuccess else { return nil }
return result as? Data
}Ein Item aktualisieren
SecItemUpdate erwartet zwei Dictionaries: eine Abfrage, die das Item findet, und ein Dictionary mit den zu aktualisierenden Attributen. Nur die von Ihnen angegebenen Attribute werden geändert; alles andere bleibt erhalten.
import Security
func update(_ newData: Data, account: String) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account]
let attrs: [String: Any] = [
kSecValueData as String: newData]
return SecItemUpdate(query as CFDictionary,
attrs as CFDictionary) == errSecSuccess
}Ein Item löschen
SecItemDelete entfernt passende Items. Wenn Sie etwas löschen, das nicht existiert, wird errSecItemNotFound zurückgegeben. Beim Löschen von Anmeldedaten während des Abmeldens können Sie dies als Erfolg behandeln.
import Security
func delete(account: String) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account]
let status = SecItemDelete(query as CFDictionary)
return status == errSecSuccess
|| status == errSecItemNotFound
}OSStatus decodieren
Fehler werden als ganzzahlige OSStatus-Codes zurückgegeben. SecCopyErrorMessageString wandelt einen solchen Code in eine für Menschen lesbare Beschreibung um. Das ist beim Debuggen äußerst hilfreich, wenn ein Speichern oder Auslesen fehlgeschlagen ist.
import Security
func describe(_ status: OSStatus) -> String {
return SecCopyErrorMessageString(status, nil)
as String? ?? "OSStatus \(status)"
}Items eindeutig identifizieren
Items werden anhand ihrer Kombination von Attributen gefunden — bei generischen Passwörtern typischerweise über kSecAttrService und kSecAttrAccount. Wählen Sie eine stabile, app-spezifische Service-Zeichenfolge, damit verschiedene Geheimnisse niemals miteinander kollidieren.
import Security
// Uniqueness for generic passwords usually comes from:
// service (your bundle id) + account (the username)
let service = "com.example.app.auth"
let account = "current-user"
_ = (service, account)Ein kleiner Wrapper
Da die direkte API sehr ausführlich ist, kapseln Teams sie in einem kleinen Typ, der save, read und delete bereitstellt. Dadurch befindet sich die kSec-Zeremonie an einer einzigen Stelle und die Aufrufstellen bleiben übersichtlich.
import Security
struct TokenStore {
let service = "com.example.app.auth"
func read(_ account: String) -> Data? {
let q: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne]
var out: CFTypeRef?
return SecItemCopyMatching(q as CFDictionary, &out)
== errSecSuccess ? out as? Data : nil
}
}Kurztest
Rufen Sie sich in Erinnerung, wie Sie die Bytes eines gespeicherten Geheimnisses korrekt abrufen.
Zusammenfassung
Sie haben CRUD-Operationen mit dem Keychain gelernt:
- Speichern Sie Anmeldedaten im verschlüsselten Keychain, niemals in UserDefaults oder Dateien.
- Beschreiben Sie Items mit
kSec-Abfrage-Dictionaries; wählen Sie eine Klasse wiekSecClassGenericPassword. SecItemAdd/SecItemCopyMatching/SecItemUpdate/SecItemDeletedecken den gesamten Lebenszyklus ab; behandeln SieerrSecDuplicateItemmit einem Upsert.- Identifizieren Sie Items über Service und Account und decodieren Sie
OSStatuszum Debuggen.
Häufig gestellte Fragen
Ist die Lektion „Geheimnisse im Keychain speichern“ kostenlos?
Ja — der vollständige Text von „Geheimnisse im Keychain speichern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Geheimnisse im Keychain speichern“?
Speichern und rufen Sie Zugangsdaten sicher ab. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Geheimnisse im Keychain speichern“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Geheimnisse im Keychain speichern
- Zugriffskontrolle für den Keychain
- Biometrische Authentifizierung
- Datenschutz und Verschlüsselung