Kryptographie in Swift (iOS/macOS): Verschlüsselung und Hashing

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

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,

Empfehlungen