Unterschiedliche Verschlüsselungsanforderungen an Daten für OnlineDB umsetzen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von MrTrebron.

    Unterschiedliche Verschlüsselungsanforderungen an Daten für OnlineDB umsetzen

    Hi,

    folgendes Unterfangen hat zu Fragen geführt:

    -ich möchte User Daten in einer Online/Cloud DB speichern
    -da die Daten nicht auf einem lokalen Server liegen. Möchte ich die sensiblen Daten verschlüsseln (eigentlich fast alle)
    -ich habe also POCO Klassen (plain old class) mit z.B. folgenden Properties: UserEmailAddress, Name, Vorname, Strasse, ...

    Konkret das Beispiel für das Property UserEmailAddresse.
    1. Ich möchte das die UserEmailAddress nicht als Klartext in der DB steht, aber ich möchte dem User auch Emails senden können -> Hash geht nicht.

    2. Später soll anhand der Emailadresse der Datensatz in der DB gefunden werden können (komplette POCO User.cs inkl. Property UserEmailAddress) -> AES mit wechselndem Salt geht daher auch nicht; oder doch?

    Meine Lösung wäre, dass ich mir ein eigenes Attribute erzeuge [Encryption] und die Properties damit 'ziere' die ich verschlüsselt in der DB speichern möchte.
    Also müsste ich im konkreten Fall [Encryption] UserEmailAddress benutzen. Wenn ich später die POCO User speichern möchte, wird in der Speichern-Methode jedes Property nach dem Attribute untersucht, falls vorhanden erfolgt eine AES Verschlüsselung und Speicherung in der DB.

    Um dann aber die 'Suchbarkeit' für dieses Property zu erhalten, muss in der POCO User-Class das Property nochmal eingepflegt werden als String mit dem Appendix UserEmailAddress_SearchHash. Hier speichere ich dann den Hash von dem Klartext UserEmailAddress.
    Im späteren Abfragefall kann der User das Suchwort in Klarform eintippen, es wird gehashed und dann wird der Datensatz danach in der DB.

    Ich hätte also zwingend zwei Properties in der POCO User:
    UserEmailAddress -> AES+Salt verschlüsselt
    USerEmailAddress_SearchHash -> der Hash

    Meine Probleme damit:
    1. das mit dem doppelten Properties widerstrebt mir
    2. dann wäre die Verschlüsselung nur so gut wir der Hash. Man denke an Straßennamen Lange Str. -> immer der selbe Hashwert und könnte leicht geraten werden.

    Ich hab gesehen, dass MongoDB (diese DB möchte ich auch nutzen) etwas hat, dass Client-Side Field Level Encryption heißt (CSFE) was anscheinend die Lösung wäre. Die Umsetzung bekomme ich jedoch in C# nicht hin und ich bin mir auch nicht sicher, ob das als kostenlose Möglichkeit umsetzbar ist.

    Meine Fragen wären:

    1. Ist es richtig, dass man einen string der mit AES+wechselndemIV+randomSAlT verschlüsselt wird nicht mehr als Suchparameter benutzen kann?
    Also suche alle Datensätze mit NAME=Meyer geht dann nicht mehr?

    2. Ist die Richtung der Lösung mit Attribute und _SearchHash richtig?

    3. Was ist mit z.B. Property Straße falls das suchbar bleiben sollte -> immer der selbe Hash, ist das ein Sicherheitsproblem?

    Lg Nogood und danke für Antworten und sorry für die Komplexität :) <X :)
    codewars.com Rank: 4 kyu
    Hallo,

    also das Unternehmen, bei dem ich als Freelancer tätig bin, verschlüsselt (AES + Key) alle Felder am Client und schreibt dann per SQL in eine externe MySQL Datenbank. D.h. sollte jemand mitlesen, dann sieht dieser nur die verschlüsselte Texte. Er fängt somit nichts an. Besser wäre natürlich eine verschlüsselte Verbindung zur Datenbank. Dann kannst die Daten im Klartext senden. Bei dieser Variante ist eben das Problem, du kannst nicht direkt z.B. mit einer Workbench die Daten im Klartext sehen. Musst dir ein Tool bauen, welches die Daten entschlüsselt.

    Die Spalten sind alles varchar mit entsprechender Länge, wo dann der schlüsselte Text steht. Beim Lesen natürlich in die andere Richtung...

    GerhardW schrieb:

    sollte jemand mitlesen, dann sieht dieser nur die verschlüsselte Texte
    Die Datenbank halt auch nicht.
    Abfragen mit größer und kleiner oder mit LIKE laufen ins Leere.
    Auch ein ORDER BY läuft schief.
    Wenn du die DB als reinen Datenspeicher nutzen willst, geht das.
    Aber die Datenbankintelligenz ist weitgehend abgeschaltet.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod

    Ja, da hast du Recht und ich persönlich finde es als Schwachsinn so etwas zu machen. Aber diese Firma hat das schon vor meiner Zeit gemacht. Es wurde dann ein Tool gebaut, wo die Daten geladen, entschlüsselt und angezeigt wurden.
    Also ein DataGrid mit Sortieren, Suchen und Filter etc.
    SQL Abfragen im Programm wurden eben nur ohne Like etc. also mit konkret bestimmte Werte gemacht, welche verschlüsselt waren. Das geht aber sehr beschränkt...

    Mein Rat an die Firma war, die Verbindung zu verschlüsseln. Bei MySQL geht das ab der Version 5.7.30 ohne Probleme. Habe ich getestet.

    nogood schrieb:

    Ich hab gesehen, dass MongoDB (diese DB möchte ich auch nutzen) etwas hat, dass Client-Side Field Level Encryption heißt (CSFE) was anscheinend die Lösung wäre. Die Umsetzung bekomme ich jedoch in C# nicht hin und ich bin mir auch nicht sicher, ob das als kostenlose Möglichkeit umsetzbar ist.


    Wer lesen kann ist klar im Vorteil. Wenn man deinem Link folgt, dann sieht man ab welcher Mongo Version und in welcher Ausprägung das Feature vorhanden ist:
    Enterprise Feature
    The automatic feature of field level encryption is only available in MongoDB Enterprise 4.2 or later, and MongoDB Atlas 4.2 or later clusters.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.

    nogood schrieb:

    ich bin mir auch nicht sicher, ob das als kostenlose Möglichkeit umsetzbar ist.


    Weil du geschrieben hast, dass du dir nicht sicher bist. dabei ist es in deiner Quelle genau geschrieben.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    @MrTrebron Das es prinzipiell umsetzbar ist, steht ja außer Frage. Es ging um Umsetzung und kostenlose Möglichkeit.

    ----
    Edit, um nicht noch mehr Spam in den Thread zu bringen. Ich hab nicht nur die Seiten die ich verlinkt hab gelesen sondern noch mehrere Stunden investiert, um das eventuell gangbar zu machen.

    Ich muss zugeben, dass so ein Spruch "..wer lesen kann, ist klar im Vorteil.." in soll einem Fall schmerzt und mir nicht 100% klar ist, dass das nicht doch im DemoModus/Freikontingent oder wie man das auch nennt enthalten ist.
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nogood“ ()

    Und da steht in deinem Link klar drin, dass die Enterprise-Variante benötigt wird. Durch lesen hätte man diese Unsicherheit ausräumen können.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.