Kryptographie in Swift (iOS/macOS): Verschlüsselung und Hashing
In der modernen Entwicklung für iOS und macOS ist Datensicherheit eine der obersten Prioritäten. Apple bietet leistungsstarke integrierte Werkzeuge für den kryptographischen Schutz: vom einfachen Hashing bis zur asymmetrischen Verschlüsselung. In diesem Artikel betrachten wir, wie man CryptoKit (das empfohlene Framework ab iOS 13 / macOS 10.15) und das klassische CommonCrypto für typische Aufgaben einsetzt: Verschlüsselung, Hashing und Datenauthentifizierung.
Grundlegende Konzepte
Bevor wir zum Code übergehen, klären wir die Begriffe:
- Symmetrische Verschlüsselung – Ein Schlüssel wird sowohl zum Verschlüsseln als auch zum Entschlüsseln verwendet (z. B. AES).
- Asymmetrische Verschlüsselung – Ein Schlüsselpaar: ein öffentlicher (zum Verschlüsseln) und ein privater (zum Entschlüsseln).
- Hashing – Eine irreversible Umwandlung von Daten in eine Zeichenkette fester Länge (SHA-256).
- HMAC – Ein hashbasierter Nachrichtenauthentifizierungscode unter Verwendung eines Schlüssels.
1. Hashing mit CryptoKit
CryptoKit ist ein modernes Swift-Framework, das Kryptographie einfach und sicher macht. Für das Hashing wird die Struktur SHA256 verwendet.
import CryptoKit
func hashString(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}
// Beispiel zur Verwendunglet password = "MySecurePass123"let hash = hashString(password)print("SHA-256 Hash: \\(hash)")Ebenfalls verfügbar sind SHA384, SHA512 und SHA1 (letzteres nur aus Kompatibilitätsgründen).
2. HMAC (Nachrichtenauthentifizierung)
HMAC fügt dem Hash einen Schlüssel hinzu, was vor Fälschung schützt. In CryptoKit wird dies über HMAC mit Angabe des Algorithmus implementiert:
import CryptoKit
func hmacSHA256(key: SymmetricKey, message: String) -> String { let messageData = Data(message.utf8) let code = HMAC<SHA256>.authenticationCode(for: messageData, using: key) return code.compactMap { String(format: "%02x", $0) }.joined()}
// Schlüsselgenerierunglet key = SymmetricKey(size: .bits256)let hmac = hmacSHA256(key: key, message: "Wichtige Nachricht")print("HMAC: \\(hmac)")3. Symmetrische Verschlüsselung (AES-GCM)
AES-GCM ist ein moderner Verschlüsselungsmodus, der sowohl Vertraulichkeit als auch Authentifizierung bietet (verhindert Datenmanipulation). CryptoKit unterstützt ihn von Haus aus.
import CryptoKit
func encryptAESGCM(plainText: String, key: SymmetricKey) throws -> Data { let plainData = Data(plainText.utf8) let sealedBox = try AES.GCM.seal(plainData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
func decryptAESGCM(encryptedData: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: encryptedData) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// Beispiellet key = SymmetricKey(size: .bits256)let originalText = "Geheime Daten"
do { let encrypted = try encryptAESGCM(plainText: originalText, key: key) let decrypted = try decryptAESGCM(encryptedData: encrypted, key: key) print("Entschlüsselt: \\(decrypted)")} catch { print("Fehler: \\(error)")}Wichtig: combined enthält alles, was für die Entschlüsselung benötigt wird (nonce, ciphertext, tag). Bewahren Sie es zusammen mit den verschlüsselten Daten auf.
4. Asymmetrische Verschlüsselung (RSA) über CommonCrypto
Für RSA bietet CryptoKit keine direkte API, aber man kann Security.framework und CommonCrypto verwenden.
Auch in der Bibliothek
SMS-Versand mit C++: API-Bibliothek LibCurl und REST-Anfragen
Datenbankmigrationen in Swift: Tools und Ansätze für iOS/macOS
Arbeiten mit Excel in Java: Apache POI und Alternativen
Air für Go: Vollständige Anleitung mit Beispielen
Event Bus und das Observer-Pattern in Java: Implementierung einer lose gekoppelten Architektur