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
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
codewars.com Rank: 4 kyu