Blog

Verschlüsselung leicht gemacht

Verschlüsselung sicher umsetzen

Verschlüsselung in die eigene Anwendung zu integrieren ist ein häufiger Wunsch von Entwicklern. Dieser Artikel soll eine kurze Einführung in dieses unglaublich komplexe Thema bieten. Es gibt leider kein Patentrezept, um Daten sicher zu verschlüsseln.

Verschlüsselung, aber richtig

Bevor man sich überhaupt überlegt, wie man technisch verschlüsselt und welche Algorithmen man verwendet, muss man noch einmal einen Schritt zurückgehen. Eine sichere Verschlüsselung in die eigene Applikation zu integrieren ist nämlich weniger eine technische, sondern mehr eine konzeptuelle Frage.

Die erste Frage, die es zu beantworten gilt: Welche Daten will ich vor wem schützen? Die Beantwortung dieser Frage ist die absolute Grundlage, ohne die es nicht möglich ist, ein sicheres Verschlüsselungsverfahren einzusetzen.

Zum einen muss klargemacht werden, welche Daten verschlüsselt werden sollen. Das hört sich erstmal als einfache Frage an, ist es aber gar nicht. Beispiel: Sie entwickeln einen Online-Shop oder ein CRM-System und wollen die Kundendaten verschlüsseln. Hört sich erstmal super an. Aber wie wollen Sie diese Daten dann verarbeiten? Wie wollen Sie diese Daten wiederfinden – eine Suche nach verschlüsselten Daten ist ja erstmal nicht möglich.

Vor wem will ich die Daten schützen?

Ist definiert, welche Daten verschlüsselt werden sollen, geht es um die nächste Frage: Vor wem will ich die Daten schützen?

Folgende Beispiele sollen die Tragweite dieser Frage demonstrieren. Sie möchten die Zugangsdaten für die Datenbank Ihrer Applikation schützen. Das Szenario ist, dass ein Angreifer eine Schwachstelle in Ihrer Applikation findet und beliebige lokale Daten auslesen kann. Wenn er darüber die Konfiguration herunterlädt, soll er zumindest nicht direkt die Datenbankzugangsdaten haben. Damit ist klar, dass die Ver- und Entschlüsselung serverseitig passieren muss. Ohne die Zugangsdaten kann Ihre Anwendung ja nicht auf den Datenbankserver zugreifen.

Ein anderes Beispiel: Sie wollen die Daten vor Ihren Administratoren schützen, da Sie einen sicheren Messaging-Dienst betreiben. Das bedeutet, dass die Ver- und Entschlüsselung auf dem Client stattfinden muss. Eine alternative Lösung, wie ich sie schon einmal bei einem Penetrationstest gesehen habe, dass die Daten an einen Server gesendet werden und dieser dann ver- bzw. entschlüsselt, bringt in diesem Fall nichts. Die Daten sind ja im Klartext auf dem Server zugänglich, selbst wenn diese nur im Arbeitsspeicher stehen.

Wichtige Fragen, um die richtige Verschlüsselungs-Architektur zu finden

Die wichtigste Frage haben wir schon angesprochen: „Welche Daten“ und vor wem. Das „Warum“ hängt dann wieder mit dem „Wem“ zusammen. Damit kann geklärt werden, „Wo“ die Verschlüsselung stattfinden muss.

Ist das alles geklärt, kann man sich der technischen Umsetzung widmen, also dem „Wie„.

Verschlüsselung sicher umgesetzt

Wie bereits erwähnt werden in diesem Artikel die technischen Details zur Verschlüsselung durchgesprochen. Die Schlüsselverwaltung ist ein eigenes, hochkomplexes Thema, welches in einem folgenden Blog-Artikel durchgesprochen wird.

In diesem Abschnitt möchte ich Sie als erstes bitten: Bauen Sie kein eigenes Verschlüsselungverfahren. Bruce Schneier hat es einmal schön zusammengefasst (heutzutage als Schneiers Law bekannt), welches ich sehr frei übersetzen möchte:

Jeder kann eine Verschlüsselung entwickeln, die so clever ist, dass man sie selbst nicht brechen kann. Die Herausforderung besteht darin, eine zu entwickeln, die auch niemand anderes selbst nach vielen Jahren Analyse brechen kann.

Wir hatten leider schon sehr viele Audits, in denen Kunden ihr eigenes Kryptosystem entwickelt haben und leider hat es diesen Namen noch kein einziges Mal verdient.

Ein zweiter wichtiger Punkt ist: Wenn Sie sich dazu entscheiden, einen vorhandenen Algorithmus zu verwenden, implementieren Sie diesen nicht selbst. Es ist nahezu unmöglich, alleine an alle Seitenkanal-Angriffe und andere Attacken zu denken, die eine Verschlüsselung nutzlos machen können.

Das Salz in der Suppe: libsodium

Glücklicherweise gibt es heute Bibliotheken, die einem viele Probleme abnehmen, wenn es um die Verwendung von Verschlüsselung geht. Einen ganz großen Schritt hat das Team um Daniel J. Bernstein, Tanja Lange und Peter Schwabe gemacht, als sie das NaCl (gesprochen: salt)-Projekt ins Leben gerufen haben. NaCl stellt viele Funktionen bereit, die für ein sicheres Krypto-System benötigt werden. Darauf aufbauend wurde die Bibliothek „libsodium“ entwickelt, welches es portabel macht und für nahezu alle verfügbaren Programmiersprachen zugänglich macht. Auch die sehr freizügige ISC-Lizenz erlaubt den Einsatz in allen Projekten, auch wenn diese kommerziell sind (Achtung, die Wrapper für bestimmte Programmiersprachen könnten andere Lizenzen verwenden).

Was libsodium einem abnimmt

Selbst wann man einen grundsätzlich sicheren Algorithmus hat, ist es eine enorme Herausforderung, diesen auch sicher zu implementieren. Zum einen gibt es Seitenkanalangriffe. Dabei findet der Angriff nicht direkt auf die Verschlüsselung statt, sondern man versucht, über Umwege Rückschlüsse auf den Klartext oder den eingesetzten Schlüssel zu erlangen. libsodium berücksichtigt diese Möglichkeit bereits, weswegen man sich als Entwickler nicht darum kümmern muss.

Auch praktisch schwierige Themen wie Padding und Authentifizierung werden vollständig von libsodium übernommen. Das Padding wird bei Block-Ciphern immer benötigt, da diese nur in ganzen Blöcken funktionieren können. Bei AES sind dies beispielsweise immer 16-Byte-Blöcke. Sind die zu verschlüsselnden Daten nur 8 Byte lang, müssen die verbleibenden 8 Byte aufgefüllt werden. Eine weitere Schwierigkeit ist das Thema Authentifizierung in der Verschlüsselung. Authentifizierung heißt in dem Zusammenhang, Manipulationen am Ciphertext (den verschlüsselten Daten) erkennen zu können. AES selbst bietet beispielsweise keine integrierte Authentifizierung, erst mit dem Cipher-Mode GCM wird diese hinzugefügt.

In Kombination: Probleme beim Padding und fehlende Authentifizierung kann dies dazu führen, dass der Klartext wiederhergestellt werden kann, da vielleicht ein Padding-Oracle möglich ist.

Das ist im Übrigen nur ein kleiner Auszug von dem, was man bei Krypto alles falsch machen kann. libsodium kümmert sich glücklicherweise um die ganzen Themen rund um die Verschlüsselung.

Installation von libsodium

libsodium kann auf allen Plattformen selbst kompiliert werden. Für Windows gibt es auch schon vorgefertigte DLLs. Leider sind diese nicht digital signiert, weswegen man die Verifikation der DLLs selbst durchführen muss.

Schade ist hierbei, dass die Entwickler zwar mit PGP signieren, der Schlüssel aber nur auf der Homepage zu finden ist und nicht von anderen beglaubigt wurde. Ansonsten kann noch das Tool Minisign verwendet werden, wobei man auch hier dem angegebenen Schlüssel auf der Homepage vertrauen muss.

Wichtig ist jedoch, dass eine Verifikation stattfindet! Die beste Krypto-Bibliothek hilft natürlich nichts, wenn diese präpariert wurde und beispielsweise schlechten Zufall generiert oder eine andere Backdoor integriert.

Alle Bindings für andere Programmiersprachen bauen auf libsodium aus, verwenden also die DLL oder das Shared-Object. Die Datei muss also vor der Nutzung eingebunden werden. Wie das genau funktioniert, ist je nach Programmiersprache anders, wird aber in den einzelnen Projekten sehr gut beschrieben.

Wie geht es jetzt weiter?

Der nächste Schritt ist es, sich mit den Bindings der entsprechenden Programmiersprache vertraut zu machen und ein wenig zu spielen. Ein kleiner Hinweis: Wenn die Dokumentation für ein Binding schlecht ist, nehmen Sie einfach ein anderes. Bei Java beispielsweise gibt es viele Bibliotheken, aber manche werden besser gepflegt und vor allem dokumentiert.

Grundsätzlich möchte ich jedoch noch folgende Anmerkungen geben:

Nichts dem Zufall überlassen, oder doch?

Gute Verschlüsselung benötigt kryptographisch sicheren Zufall. libsodium verwendet die internen Funktionen des Betriebssystems zur Generierung von Zufallsdaten, weswegen man der Zufallsfunktion (z.B. randombytes_buf) getrost vertrauen darf.

Hinweise zur symmetrischen Verschlüsselung

Bei der symmetrischen Verschlüsselung bleibt zu sagen, dass Sie einen Key nicht mehrmals verwenden sollten. Auch die Nonce – das kommt von „not more than once“ – darf nur einmal(!) verwendet werden. Generieren Sie immer wieder eine neue Nonce mit Hilfe der Zufallsfunktion.

Verwendet man die High-Level-Funktion zur Verschlüsselung, verwendet libsodium mit Stand Oktober 2017 XSalsa20 Stream Cipher zur Verschlüsselung und Poly1305 zur Authentifizierung. Es gibt auch die Möglichkeit, AES-GCM zu verwenden. Dies kann von Vorteil sein, wenn man bestimmte Kriterien erfüllen muss. Dieser Algorithmus wird u.a. deswegen nicht als Standard benutzt, weil er nur zur Verfügung steht, wenn die CPU die AES-NI-Instruktionen unterstützt.

Asymmetrische Verschlüsselung

Bei der asymmetrischen Verschlüsselung bietet libsodium Funktionen zur Generierung der Schlüsselpaare und kümmert sich – wie bereits oben erwähnt – vollständig auch um Padding und Authentifizierung. Als Algorithmen kommen (Stand Oktober 2017) X25519 für den Schlüssel, XSalsa20 stream cipher für die Verschlüsselung und Poly1305 zur Authentifizierung zum Einsatz.

Hashing

Die Funktionen zum Hashing, die libsodium bietet, erlauben ein einfaches Hashing, also selbe Eingabe führt zur selben Ausgabe, oder auch die Kombination mit einem Passwort für ein HMAC-Szenario. Der eingesetzte Algorithmus ist (Stand Oktober 2017) BLAKE2b einer der Finalisten für SHA-3.

Passwort

Wir haben in unserem Artikel zur sicheren Speicherung von Passwörtern schon darüber geschrieben. libsodium stellt glücklicherweise schon entsprechende Funktionen zur sicheren Passwort-Speicherung bereit. In der Standardimplementierung verwendet die aktuelle libsodium-Version Argon2.

Ausblick

Wir werden uns in den nächsten Wochen genauer mit diesem kritischen Thema auseinandersetzen. Ziel ist es, dass Sie lernen, wie libsodium am besten angewendet wird und Sie tatsächlich sichere Verschlüsselung in Ihre Applikation integrieren können. Wenn es schon etwas akuter ist, können wir Sie natürlich auch gerne direkt beraten. Wir sind übrigens auch gespannt über Ihr Feedback!

Vorheriger Beitrag
XXE: Angriff über ein Serialisierungsformat
Nächster Beitrag
OpenVPN-Review: Sicherheitsanalyse von OpenVPN-Konfigurationsdateien

Ähnliche Beiträge

Es wurden keine Ergebnisse gefunden, die deinen Suchkriterien entsprechen.