kurz & knapp – Snapshot vom neuland-Innovationstag*: Kollegen befragen Kollegen und geben allen Interessierten Einblick in die vielfältigen Themen und Möglichkeiten zur Beteiligung bei neuland - Dr. Jörn Grapp im Interview mit Olaf Sebelin und Michel Bartsch
-
Welches Problem wolltet Ihr lösen? Was war Euer Ziel?
Wir wollten das Speichern und Verschlüsseln von Value Objekten mit Spring Boot Data in einer MongoDB untersuchen. Zum einen erschien uns die Lesbarkeit nicht verschlüsselter Attribute in der Datenbank als schwierig. Zum anderen wollten wir untersuchen, wie sich application level encryption at rest realisieren lässt. -
Was genau habt Ihr gemacht und was ist das Ergebnis?
Wir haben dann ein Beispiel-Spring-Boot-Projekt mit MongoDB-Support aufgesetzt. Als Beispiel-Entity haben wir einen Customer gewählt, der u.a. aus einer Rechnungsadresse, einer Lieferadresse, Login, Passwort etc. besteht. Dabei war es uns wichtig, dass das Beispiel mit den Attributen simpel genug für den Innovationstag ist, aber auch komplex genug, um daraus praktisch verwertbare Einsichten zu erhalten und Schlüsse ziehen zu können, z.B. die gesteigerte Lesbarkeit betreffend.
Die erste naheliegende Änderung der Konfiguration bestand darin, nicht mehr den voll qualifizierten Klassennamen, sondern lediglich ein Typ-Alias in der DB zu speichern. Allerdings geht das z.B. bei der optionalen, abweichenden Lieferadresse, die wir mit einer VAVR-Option modelliert haben, nicht ganz so einfach. Dieses Problem haben wir jedoch zunächst außer Acht gelassen. Die Lösung wäre hier, die Option gar nicht zu serialisieren.
Wenn man sich das gespeicherte Dokument anschaut, fällt auf, dass durch die vielen verschachtelten Dokumente die Menschen-Lesbarkeit reduziert ist:In einem ersten Schritt wollten wir einen Weg finden, alle Value-Objekte flach zu serialisieren. Die Spring-Data-Doku legt nahe, dass man für jeden ValueObject-Typ einen Read- und einen Write-Converter registrieren muss. Da ein DDD-Projekt potenziell Dutzende bis Hunderte von Value-Objekten enthält, war das keine gangbare Lösung. Eine Google-Suche lieferte viele ähnliche, aber kein exakt passendes Problem und die Lösung dazu. Zum Glück ist Spring Open-Source-Software und man kann in den Quellcode schauen. Die Lösung bestand in einer eigenen ConverterFactory, die ConditionalConverter implementiert. Das erlaubt, einen Converter für alle Value-Objekte zu bauen.
Das Ergebnis sieht dann schon deutlich kompakter aus:Um nun Verschlüsselung einzubauen, haben wir spring-data-mongodb-encrypt zum Projekt hinzugefügt. Leider ist es nicht mit der aktuellen Spring-Data-Version kompatibel, lässt sich aber in den Value-Objekt-Serialisierern verwenden. Hier das Ergebnis mit feldweiser Verschlüsselung:
So weit, so verschlüsselt. Jetzt sind aber alle Value-Objekte verschlüsselt und man würde z.B. den Kunden nicht ohne Weiteres über seine E-Mail-Adresse finden, um z.B. das Login durchzuführen. Man muss also noch die vertraulichen Value-Objekte bzw. die Felder z.B. über eine Annotation erkennen und nur diese verschlüsseln. Darüber hinaus ist noch zu bewerten, ob und wie nach Attributen gesucht werden kann (falls das die fachliche Anforderung ist) und ob nicht ganze Teil-Dokumente verschlüsselt werden sollten.
-
Was war Eure wichtigste Erkenntnis? Könnt Ihr etwas empfehlen?
Durch unsere Anpassungen müssen im Vergleich zu vorher nicht mehr Dutzende Serialisierer und Deserialisierer geschrieben werden. Das ist damit dynamisch möglich. Wie so oft stellen wir fest, dass mit Spring irgendwie immer alles geht, man nur oft den Debugger braucht, um die Lösung zu finden. -
Was war besonders schwierig?
Schwierigkeiten in dem Sinne gab es eigentlich nicht. Wir hätten vielleicht, um mehr Zeit beim Innovationstag selbst zur Verfügung zu haben, ggfs. im Vorfeld bereits das Customer-Beispiel anlegen können. Und natürlich mussten wir uns erstmal in den Spring Code reindebuggen. -
Seid Ihr mit dem Ergebnis zufrieden?
Wir hätten gerne einfach noch mehr Zeit gehabt, um neben der Lesbarkeit auch die Verschlüsselung der Value-Objekte weiter zu untersuchen. Darum möchten wir uns gerne im nächsten Schritt noch kümmern.
*An unseren Innovationstagen entwickeln wir in 24 Stunden außerhalb der Projektarbeit Ideen und treiben diese voran.
Links zum Thema:
- ConverterFactory: org.springframework.core.convert.converter.ConverterFactory
- ConditionalConverter: org.springframework.core.convert.converter.ConditionalConverter
- spring-data-mongodb-encrypt
- application level encryption at rest
Bild-Quelle: Link