Kryptographie in Swift (iOS/macOS): Verschlüsselung und Hashing
In der modernen Entwicklung für iOS und macOS ist Datensicherheit ein kritisch wichtiger Aspekt. Swift bietet leistungsstarke integrierte Werkzeuge für die Kryptographie, angefangen bei der low-level CommonCrypto (C-API) bis hin zum modernen Framework CryptoKit (iOS 13+/macOS 10.15+). In diesem Artikel analysieren wir die wichtigsten Methoden der Verschlüsselung und des Hashings, die dem Swift-Entwickler zur Verfügung stehen.
1. Hashing
Hashing ist die einseitige Umwandlung von Daten in eine Zeichenkette fester Länge. Es wird verwendet, um die Datenintegrität zu überprüfen und Passwörter (mit Salt) zu speichern.
Beispiel mit CryptoKit (SHA-256)
import CryptoKit
func hashSHA256(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}
// Verwendunglet hash = hashSHA256("Hello, Swift!")print("SHA-256: \\(hash)")// Ausgabe: 8e3a... (64 Zeichen)Beispiel mit CommonCrypto (MD5, veraltet)
Hinweis: MD5 wird für die Sicherheit nicht empfohlen, kann aber zur Integritätskontrolle verwendet werden.
import CommonCrypto
func md5Hash(_ input: String) -> String { let data = Data(input.utf8) var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) data.withUnsafeBytes { bytes in _ = CC_MD5(bytes.baseAddress, CC_LONG(data.count), &digest) } return digest.map { String(format: "%02x", $0) }.joined()}2. Symmetrische Verschlüsselung (AES-GCM)
Symmetrische Verschlüsselung verwendet einen einzigen Schlüssel zum Ver- und Entschlüsseln. CryptoKit bietet eine sichere Implementierung von AES-GCM (Galois/Counter Mode).
Beispiel für Ver- und Entschlüsselung mit CryptoKit
import CryptoKit
func encryptAESGCM(plaintext: String, key: SymmetricKey) throws -> Data { let plaintextData = Data(plaintext.utf8) let sealedBox = try AES.GCM.seal(plaintextData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
func decryptAESGCM(ciphertext: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: ciphertext) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// Verwendunglet key = SymmetricKey(size: .bits256) // 256-Bit-Schlüssellet encrypted = try encryptAESGCM(plaintext: "Geheime Nachricht", key: key)let decrypted = try decryptAESGCM(ciphertext: encrypted, key: key)print("Entschlüsselt: \\(decrypted)")3. Asymmetrische Verschlüsselung (RSA)
Asymmetrische Verschlüsselung verwendet ein Schlüsselpaar: einen öffentlichen (zum Verschlüsseln) und einen privaten (zum Entschlüsseln). In iOS/macOS wird für die Arbeit mit RSA das Security.framework und SecKey verwendet.
Beispiel für Schlüsselgenerierung und RSA-Verschlüsselung
import Security
func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false], kSecPublicKeyAttrs as String: [kSecAttrIsPermanent as String: false] ] guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, nil) else { return nil } let publicKey = SecKeyCopyPublicKey(privateKey)! return (privateKey, publicKey)}
func encryptRSA(plaintext: String, publicKey: SecKey) -> Data? { let plaintextData = Data(plaintext.utf8) var error: Unmanaged<CFError>? guard let ciphertext = SecKeyCreateEncryptedData( publicKey, .rsaEncryptionPKCS1, plaintextData as CFData, Auch in der Bibliothek
Zod — leistungsstarke Bibliothek zur Datenvalidierung in TypeScript
GraphQL in C++: Die Bibliothek cppgraphqlgen zur API-Erstellung
Event Bus und das Observer-Pattern in Swift (iOS/macOS)