Was ist CryptoKit?
Mit iOS 13 bietet Apple dank CryptoKit (FIPS Compliant) ein modernes eigenes Framework, das kryptographische Operationen sicher und effizient den Entwicklern zur Verfügung stellt. CryptoKit ist dabei ein in Swift geschriebenes Kryptographie-Framework für die Apple-Plattformen. Es bietet einfache und bequeme Schnittstellen für Entwickler zu kryptographischen Operationen. Entwickler müssen sich nicht mehr um die Verwaltung von Zeigern oder anderen Low-Level-Konzepten aus der C-Programmierung kümmern, da diese in Swift einfach nicht existieren. Entwickler müssen auch keine manuelle Speicherverwaltung mehr durchführen.
Abbildung 1: Kryptografische Funktionen in CryptoKit
Inhaltlich bietet CryptoKit Entwicklern die folgenden Operationen (siehe Abbildung 1):
- Hashes berechnen und vergleichen
- Public-Key-Kryptographie (digitale Signaturen erstellen/auswerten, den Schlüsselaustausch durchführen)
- symmetrische Kryptographie (Authentifizierung und Ver-/Entschlüsselung von Nachrichten)
Im Folgenden möchte ich Ihnen die Grundlagen für diese Operationen näher erläutern.
Was bedeutet Hashing?
Hash-Funktionen generieren einen eindeutigen Schlüssel, der so lange unverändert bleibt, wie die Eingabedaten identisch sind. Dies kann beispielsweise sehr nützlich sein, um zu überprüfen, ob zwei Kopien eines Datenelements identisch sind.
Eine Hashing-Funktion ordnet Daten beliebiger Länge einer Ausgabe fester Länge (=Hashwert) zu (siehe Abbildung 2). Eine minimale Änderung der Eingabewerte führt zu einer völlig anderen Ausgabe im ermittelten Hash.
Abbildung 2: Symbolische Darstellung einer Hashing-Funktion
Hash-Funktionen finden ihre Anwendung bei Integritätsprüfungen und zur Authentisierung. So kann die Integrität einer Datei beispielsweise mit einem entsprechenden Hash über den gesamten Datei-Inhalt nachgewiesen werden. Im Rahmen der Authentisierung werden Hash-Funktionen genutzt, um beispielsweise Kennwörter nicht in Klartext – sondern nur als Hash – in einer Datenbank abzulegen.
Das Erstellen des Hashs ist einfach, das Zurückrechnen hingegen ist schwer bis unmöglich. Daher wird dies auch als Einwegfunktion bezeichnet. Ein ermittelter Hash muss dabei einmalig und eindeutig sein. Findet eine Überschneidung von Hashes statt, gilt ein Hash-Verfahren als gebrochen und damit als unsicher (Kollisionsresistenz). Beispiele für Hash-Verfahren sind MD5, SHA-1, SHA-256, SHA-384, SHA-512 und andere.
Um ein Hash-Verfahren zusätzlich abzusichern, bedarf es etwas „Würze“. Diese Würze kann mit Salt (englisch für Salz) hergestellt werden. Das Vorgehen mit einem Salt beschreibt in der Kryptographie eine zusätzliche zufällige Zeichenfolge zu einer bestehenden Zeichenkette. So wird eine derartige Zeichenfolge an einen Klartext (z. B. besagtes Passwort) angehängt, bevor die gesamte Zeichenfolge gehasht wird.
Das Ziel des Einsatzes von Salt ist es, die Entropie, also die Zufälligkeit der erzeugten Datenmenge, weiter zu erhöhen. Die Verwendung eines Salt hilft also dabei, sich gegen vorberechnete Rainbow Tables zu schützen. Vereinfacht ausgedrückt enthalten derartige Rainbow Tables eine Vorberechnung möglicher Passwort-Hash-Verschlüsselungen (siehe Abbildung 3).
Abbildung 3: Selbst mithilfe von Google können Sie sich so genannter Rainbowtables bedienen und sich, wie in diesem Beispiel, einen Hash-Wert (MD5) zurückrechnen. Die Einwegfunktion ist damit gebrochen.
Mit CryptoKit können Entwickler auf einfache Weise verschiedene Arten von Hashes mit guter Kollisionsbeständigkeit generieren, wodurch verhindert wird, dass zwei verschiedene Eingabedaten denselben Hash generieren. CryptoKit unterstützt die Algorithmen SHA256, SHA384 und SHA512 (wie auch einige ältere, unsichere Algorithmen, die nicht verwendet werden sollten).
Entwickler können die hash(using:)-Funktion für einen beliebigen Algorithmus nutzen, um einen Hash für ein Datenelement zu generieren, z. B. eine Zeichenfolge oder eine Datei.
Eine weitere Funktion greift ebenfalls auf Hash-Funktionen zurück. Beim sogenannten Hash-based Message Authentication Code (HMAC) ist ein Message Authentication Code (MAC) mit einem kryptographischen Schlüssel in Verbindung mit einer Hash-Funktion verbunden.
Der Hash-based Message Authentication Code sorgt hier dafür, dass sowohl der Server als auch der Client über einen öffentlichen und einen privaten Schlüssel verfügen. Der Public Key darf weitergegeben werden, während der Private Key nur dem jeweiligen Server oder Client bekannt sein darf.
CryptoKit bietet auch für HMAC “Hash based message authentication code” eine entsprechende Unterstützung. Dieser Hashwert wird mit einem Schlüssel erzeugt, um die Integrität und Authentizität von Daten zwischen Kommunikationspartnern sicherzustellen. Hierbei handelt es sich also um einen „signierten Hash“.
Was bedeutet symmetrische Kryptographie?
Durch das Verschlüsseln von Dateien können Sie sowohl Authentizität als auch Vertraulichkeit erreichen, indem Sie die Eingabedaten in Chiffretext umwandeln, der nur mit dem (zufällig) generierten Originalschlüssel gelesen werden kann. Dieser muss von beiden Parteien gemeinsam genutzt werden.
Die symmetrische Verschlüsselung teilt die zu verschlüsselnden Daten in mehrere gleich große Blöcke auf, auf die die Verschlüsselung angewendet wird.
CryptoKit unterstützt hierfür die Algorithmen AES-GCM (Galois Counter Mode) als sogenannten Blockchiffre und ChaCha20-Poly1305 als sogenannten Stromchiffre. Das Blockchiffre wird beispielsweise auf Dateien angewendet. Das Stromchiffre ist im Gegensatz zum Blockchiffre nicht darauf angewiesen, dass sich erst genug zu verschlüsselnde Daten zu einem Block angesammelt haben. Hier kann jedes Klartextzeichen sofort in ein chiffriertes Ausgabezeichen überführt werden.
Um die Sicherheit einer kryptographischen Funktion sicherzustellen, bedarf es eines „echt“ zufälligen Initialisierungsvektors. CryptoKit verwendet analog hierzu einen sogenannten „Nonce“.
Abbildung 4: Symbolische Darstellung der symmetrischen Kryptographie
Die mit CryptoKit verschlüsselten Daten werden in einer sogenannten Sealed-Box bereitgestellt. Diese enthält: Nonce (analog / ähnlich IV), Ciphertext und einen Tag. Jede Verschlüsselungsoperation erfolgt mit einem neuen Zufallswert (auch wenn die Dokumentation dazu schweigt). Verschlüsselt man einen Klartext mehrfach hintereinander, so unterscheiden sich die erzeugten Ciphertexte.
Was beschreibt Public-Key-Kryptographie (asymmetrische Kryptographie)?
Asymmetrische Kryptographie verwendet zwei Schlüssel (einen öffentlichen, einen privaten Schlüssel), um eine verschlüsselte Datenkommunikation zu ermöglichen. Ein enormer Vorteil des öffentlichen und privaten Schlüssels ist es, dass die Schlüssel sich leicht verteilen lassen. Der private Schlüssel kann für die Verschlüsselung und der öffentliche Schlüssel zum Entschlüsseln und Überprüfen genutzt werden. Der öffentliche Schlüssel kann so z.B. problemfrei per E-Mail verteilt werden. Das Verfahren ist allerdings sonst sehr ineffizient, da die Algorithmen rechenintensiv sind (siehe Abbildung 5). Daher bietet sich diese Art der Verschlüsselung für Daten mit begrenzten Datenmengen oder zum Umgang mit digitalen Signaturen an.
Abbildung 5: Symbolische Darstellung der asymmetrischen Kryptographie
Digitale Signaturen werden verwendet, um die Authentizität und Integrität einer Nachricht oder eines Datenelements zu überprüfen. Nach dem Signieren der Daten mit einem privaten Schlüssel können andere Benutzer die Signatur mit dem zugehörigen öffentlichen Schlüssel überprüfen.
CryptoKit bietet dabei sowohl zur Erzeugung als auch zur Überprüfung eine Unterstützung für die Verfahren Curve25519, P521, P384 und P256. Die verschiedenen Typen haben unterschiedliche Sicherheits- und Geschwindigkeitsstufen.
CryptoKit auf mehreren Plattformen -> SwiftCrypto
Die Veröffentlichung von SwiftCrypto stellt einen großen Schritt für die Server-seitige Nutzung von Swift dar. Apple verspricht dabei, dass die große Mehrheit des SwiftCrypto-Codes im Gleichschritt mit der aktuellen Umsetzung und Entwicklung von CryptoKit bleiben soll. Dies bedeutet, dass es für Entwickler einfach ist, den Source-Code zwischen Apple-eigenen Plattformen und z.B. Linux auszutauschen.
Besonders hervorzuheben ist auch, dass SwiftCrypto bei der Verwendung auf Apple-Plattformen alle Aufrufe transparent an CryptoKit weitergibt. Dies bedeutet, dass alle logischen Operationen an CryptoKit delegiert werden, als ob SwiftCrypto gar nicht da wäre. Entwickler können ihren Code so überall verwenden.
Eine Ausnahme existiert dennoch. SwiftCrypto bietet keine Unterstützung für die Verwendung von Apples Secure Enclave-Hardware, wie diese in einem iPhone, Apple Watch oder moderneren Macs integriert ist. Da die Secure Enclave nur auf Apple-Hardware verfügbar ist, dürfte sich diese Auslassung nicht als problematisch erweisen.
Blick über den Tellerrand: Der Security – Level
In der Kryptographie ist der Security-Level eine Maßeinheit für die Stärke, die eine kryptographische Operation erreicht. Die Sicherheitsebene wird dabei normalerweise in „Bits“ ausgedrückt, wobei n-Bit-Sicherheit bedeutet, dass der Angreifer „2 hoch n“ Operationen durchführen müsste, um sie zu brechen. Der erreichte Security-Level gibt damit an, wie sicher eine Verschlüsselung ist.
Im Rahmen eines Vortrages von Grégoire Ribordy auf der IT Defense 2020 mit dem Titel „QUANTUM COMPUTING AND THE FUTURE OF CRYPTOGRAPHY“ (www.it-defense.de/it-defense-2020/programm/referenten#c1173) hat es einen interessanten Ausblick auf das Thema der Verschlüsselung in Verbindung mit Quantencomputer gegeben. Im Allgemeinen gilt demnach die symmetrische Verschlüsselung (AES) als „sicher“ und die asymmetrische Verschlüsselung (RSA, Diffie Hellmann, ECC) als „unsicher“ mit Blick auf die Quantencomputer-Technologie (siehe Abbildung 6).
Abbildung 6: Vereinfachter mathematischer Überblick (RSA)
Was fehlt noch in CryptoKit?
Am Markt gibt es durchaus Verfahren, für die es schade ist, dass sie es (noch) nicht in CryptoKit geschafft haben. So z.B. PBKDF (Password-Based Key Derivation Function), eine genormte Funktion, um von einem Passwort einen Schlüssel abzuleiten, der in einem symmetrischen Verfahren eingesetzt werden kann.
Auf das Passwort wird hier eine pseudozufällige Funktion, wie zum Beispiel eine kryptologische Hashfunktion oder ein HMAC, zusammen mit einem Salt-Wert angewendet. Die Funktion wird danach mehrmals auf das Ergebnis angewendet. Diese Verkettung erschwert es, per Brute-Force-Methode aus dem Schlüssel auf das ursprüngliche Passwort zu schließen. Durch die Verwendung von Salt wird zusätzlich der Einsatz von Rainbow Tables stark erschwert. Durch Erhöhung der Anzahl der Durchgänge kann die Funktion auch der steigenden Leistung von Computern angepasst werden.
Es bleibt zu hoffen, dass CryptoKit hier in zukünftigen Überarbeitungen nachbessert. Schauen Sie mit mir gemeinsam in meinem Intensivseminar, wo Kryptographie für Firmen eine entscheidende Rolle spielt, wie Sie iOS-Geräte schnell, effizient und erfolgreich in Ihrem Unternehmen einbinden und nutzen können.