CryptoKit für Swift: Vollständiges Tutorial mit Codebeispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist CryptoKit und warum wird es benötigt?

CryptoKit ist ein Framework für kryptografische Operationen, das von Apple entwickelt und direkt in das Swift-Ökosystem integriert wurde. Es ist ab iOS 13, macOS 10.15, watchOS 6 und tvOS 13 verfügbar. Im Gegensatz zu Drittanbieter-Bibliotheken ist CryptoKit eine native Lösung, die hohe Leistung, Sicherheit und vollständige Integration mit dem Secure Enclave-Schlüsselverwaltungssystem garantiert.

Warum wird CryptoKit benötigt? In der modernen App-Entwicklung steht die Datensicherheit an erster Stelle. CryptoKit bietet Entwicklern eine einfache, aber leistungsstarke Schnittstelle für:

  • Daten-Hashing (SHA-256, SHA-384, SHA-512)
  • Symmetrische Verschlüsselung (AES-GCM, ChaCha20-Poly1305)
  • Asymmetrische Verschlüsselung (Curve25519, P-256, P-384, P-521)
  • Digitale Signaturen (EdDSA, ECDSA)
  • Generierung kryptografisch sicherer Zufallszahlen
  • Schlüsselaustausch (Diffie-Hellman auf elliptischen Kurven)

Die Bibliothek ist so konzipiert, dass sie Entwicklerfehler minimiert: Sie verwendet standardmäßig sichere Implementierungen, verwaltet den Speicher automatisch und erlaubt keine veralteten oder unsicheren Algorithmen (z. B. MD5 oder SHA-1 für Signaturen).

Installation von CryptoKit

Da CryptoKit Teil der Apple-Standardbibliothek ist, ist keine Installation über Paketmanager (CocoaPods, Swift Package Manager oder Carthage) erforderlich. Alles, was Sie brauchen, ist ein Projekt mit einem minimalen Deployment-Target von iOS 13+ oder macOS 10.15+.

Wichtig: Wenn Sie für ältere Betriebssystemversionen entwickeln, ist CryptoKit nicht verfügbar. Verwenden Sie in diesem Fall CommonCrypto (C-Ebene) oder Drittanbieter-Bibliotheken (z. B. CryptoSwift).

Um die Verfügbarkeit von CryptoKit im Code zu prüfen, verwenden Sie:

import CryptoKit

if #available(iOS 13.0, macOS 10.15, *) {
    // Ihr Code mit CryptoKit
} else {
    // Fallback auf CommonCrypto
}

Schnellstart mit einem Codebeispiel

Betrachten wir ein einfaches Beispiel: Hashing eines Strings und symmetrische Verschlüsselung.

import CryptoKit
import Foundation

// 1. Hashing
let inputString = "Hallo, CryptoKit!"
let inputData = Data(inputString.utf8)
let hash = SHA256.hash(data: inputData)
print("SHA256 Hash: \(hash.compactMap { String(format: "%02x", $0) }.joined())")

// 2. Symmetrische Verschlüsselung (AES-GCM)
let key = SymmetricKey(size: .bits256) // Generierung eines 256-Bit-Schlüssels
let plaintext = "Geheime Nachricht".data(using: .utf8)!

do {
    let sealedBox = try AES.GCM.seal(plaintext, using: key)
    print("Verschlüsselte Daten: \(sealedBox.ciphertext.base64EncodedString())")
    
    // Entschlüsselung
    let openedBox = try AES.GCM.open(sealedBox, using: key)
    let decryptedString = String(data: openedBox, encoding: .utf8)!
    print("Entschlüsselte Nachricht: \(decryptedString)")
} catch {
    print("Verschlüsselungsfehler: \(error)")
}

Wichtige Methoden und Funktionen von CryptoKit

Nachfolgend finden Sie 10 Schlüsselfunktionen von CryptoKit mit detaillierter Beschreibung, Parametern und Beispielen.

1. SHA256.hash(data:)

Beschreibung: Berechnet den SHA-256-Hash der übergebenen Daten. Gibt ein SHA256Digest-Objekt zurück.

Parameter:

  • data: Data — Die zu hashenden Quelldaten.

Beispiel:

let data = "Beispieldaten".data(using: .utf8)!
let digest = SHA256.hash(data: data)
print(digest.description) // Ausgabe: SHA256 digest: 8f4343... (64 Zeichen)

2. SHA384.hash(data:)

Beschreibung: Analog zu SHA256, verwendet jedoch einen 384-Bit-Digest. Sicherer, aber langsamer.

Parameter: identisch mit SHA256.

Beispiel:

let digest384 = SHA384.hash(data: data)
print(digest384.description)

3. SHA512.hash(data:)

Beschreibung: Der sicherste Hash aus der SHA-2-Familie mit einem 512-Bit-Digest. Ideal für hochsensible Daten.

Parameter: identisch mit SHA256.

Beispiel:

let digest512 = SHA512.hash(data: data)
print(digest512.description)

4. AES.GCM.seal(_:using:nonce:)

Beschreibung: Verschlüsselt Klartext mit AES im GCM-Modus (Galois/Counter Mode). Bietet sowohl Vertraulichkeit als auch Authentizität.

Parameter:

  • plaintext: Data — Die zu verschlüsselnden Daten.
  • key: SymmetricKey — Der symmetrische Schlüssel (128 oder 256 Bit).
  • nonce: AES.GCM.Nonce? — Optional: Ein einmaliger Wert (Standard: automatisch generiert).

Rückgabewert: Ein AES.GCM.SealedBox-Objekt mit Chiffretext, Tag und Nonce.

Beispiel:

let key = SymmetricKey(size: .bits256)
let sealedBox = try AES.GCM.seal(plaintext, using: key)

5. AES.GCM.open(_:using:)

Beschreibung: Entschlüsselt und verifiziert einen mit AES-GCM verschlüsselten Chiffretext.

Parameter:

  • sealedBox: AES.GCM.SealedBox — Das zu entschlüsselnde Objekt.
  • key: SymmetricKey — Der gleiche Schlüssel, der zur Verschlüsselung verwendet wurde.

Beispiel:

let decryptedData = try AES.GCM.open(sealedBox, using: key)

6. ChaChaPoly.seal(_:using:)

Beschreibung: Verschlüsselung mit dem ChaCha20-Poly1305-Algorithmus. Schneller als AES auf Geräten ohne Hardware-Beschleunigung.

Parameter: identisch mit AES.GCM.seal.

Beispiel:

let chaChaSealed = try ChaChaPoly.seal(plaintext, using: key)

7. Curve25519.KeyAgreement

Beschreibung: Führt einen Schlüsselaustausch mit dem X25519-Protokoll durch. Ermöglicht zwei Parteien, einen gemeinsamen geheimen Schlüssel zu vereinbaren.

Beispiel:

let alicePrivateKey = Curve25519.KeyAgreement.PrivateKey()
let bobPrivateKey = Curve25519.KeyAgreement.PrivateKey()

let sharedSecret = try alicePrivateKey.sharedSecretFromKeyAgreement(with: bobPrivateKey.publicKey)

8. P256.Signing.PrivateKey

Beschreibung: Erzeugt einen privaten Schlüssel für digitale Signaturen mit der NIST P-256 (secp256r1) Kurve.

Beispiel:

let privateKey = P256.Signing.PrivateKey()
let signature = try privateKey.signature(for: data)

9. SecureEnclave

Beschreibung: Ermöglicht die sichere Speicherung privater Schlüssel in der Secure Enclave (verfügbar auf iOS-Geräten mit A7-Chip oder neuer).

Beispiel:

let accessControl = SecAccessControlCreateWithFlags(nil, kSecAttrAccessibleWhenUnlockedThisDeviceOnly, .privateKeyUsage, nil)!
let privateKey = try SecureEnclave.P256.Signing.PrivateKey(accessControl: accessControl)

10. SymmetricKey

Beschreibung: Generiert einen sicheren symmetrischen Schlüssel mit der angegebenen Größe.

Parameter:

  • size: SymmetricKeySize — Die Schlüsselgröße (.bits128, .bits192, .bits256).

Beispiel:

let key128 = SymmetricKey(size: .bits128)
let key256 = SymmetricKey(size: .bits256)

Best Practices und Sicherheitshinweise

Bei der Verwendung von CryptoKit sollten Sie folgende Punkte beachten:

  • Schlüsselverwaltung: Verwenden Sie die Keychain oder Secure Enclave für die Speicherung privater Schlüssel. Vermeiden Sie hartcodierte Schlüssel im Quellcode.
  • Nonce-Verwaltung: Bei AES-GCM und ChaCha20-Poly1305 darf eine Nonce niemals mit demselben Schlüssel wiederverwendet werden. CryptoKit generiert standardmäßig zufällige Nonces.
  • Fehlerbehandlung: Fangen Sie Fehler bei der Entschlüsselung ab – ein Fehler deutet auf manipulierte Daten oder einen falschen Schlüssel hin.
  • Keine veralteten Algorithmen: CryptoKit erlaubt keine unsicheren Algorithmen wie MD5 oder SHA-1 für Signaturen. Nutzen Sie diese Einschränkung zu Ihrem Vorteil.

Häufige Fehler und deren Behebung

Fehler 1: "CryptoKit is not available" – Ihr Deployment-Target ist zu niedrig. Erhöhen Sie es auf iOS 13.0 oder macOS 10.15.

Fehler 2: "Authentication failed" bei AES.GCM.open – Die Daten wurden manipuliert oder der Schlüssel ist falsch. Überprüfen Sie die Integrität der verschlüsselten Daten.

Fehler 3: "Invalid key size" – Verwenden Sie nur 128, 192 oder 256 Bit für symmetrische Schlüssel.

Fazit

CryptoKit ist ein leistungsstarkes und sicheres Framework für kryptografische Operationen in Swift. Es vereinfacht die Implementierung von Hashing, Verschlüsselung, digitalen Signaturen und Schlüsselaustausch erheblich. Dank der nativen Integration in das Apple-Ökosystem profitieren Sie von optimaler Performance und Sicherheit. Mit den hier vorgestellten Methoden und Beispielen können Sie sofort mit der Entwicklung sicherer Apps beginnen.

Probieren Sie die Beispiele selbst aus und integrieren Sie CryptoKit in Ihr nächstes Swift-Projekt!

Empfehlungen