Einzelnen Beitrag anzeigen

UntoterGeist

Registriert seit: 18. Sep 2019
25 Beiträge
 
#5

AW: SelectWhereQuery auf verschlüsselten Spalten durch Methodik beschleunigen

  Alt 15. Sep 2021, 12:10
Es müssen insgesamt natürlich alle Aspekte der Sicherheit auf ihr Risiko bewertet werden, so auch Schlüsselmanagement und Verbindungssicherheit sowie weitere die alle ihre Schwierigkeiten mit sich bringen. Wenn man alle Aspekte gleichzeitig betrachtet, dann verzettelt man sich. Für die Machbarkeit oder Fragestellung ist erstmal nur der Aspekt wichtig, ob man mit pgcrypto schutzwürdige Daten verschlüsselt speichern und on Demand verarbeiten kann. Was ja technisch geht. Nur die Verfügbarkeit ist in einigen Fällen nicht angemessen, wenn man beispielsweise suchen muss. Das Problem haben aber alle DBMS die Spaltenweise verschlüsseln und Entwickler die irgendwie Personendaten in Kombination mit sensiblen Daten speichern wollen.

Die Daten werden mit der Funktion pg_sym_decrypt(Spalte,Schlüssel) vom DBMS ver- und entschlüsselt. Ich lade also nicht alles runter, sondern nur die QueryErgebnisse. Der Schlüssel liegt also nur in der Hand des Benutzers.

Der Testquery sieht so aus und dauert bei 15.000 Datensätzen 15 Sekunden (die Suche über 3 Spalten dauert 45 Sekunden):
Code:
SELECT "id" FROM "schema"."personen" WHERE pg_sym_decrypt("name",'geheimerSchlüssel') ILIKE 'Albert%';
Der Query bei 15.000 Datensätzen dauert ca. 200 ms
Code:
SELECT "id","name","vorname" FROM "schema"."personen";
Bei dem Vorschlag von Blub (die Spalten in einer Suchspalte zusammenzufassen) kann ich mir gut vorstellen, dass wenn man in vielen Spalten gleichzeitig suchen möchte, dass das die Rechenzeit enorm reduziert weil er seine 10 Runden nur einmal durchführen muss.

Wenn man diese Suchspalte wie Jumpy sagt beim Programmstart in eine TStringList lädt, kann man sich für die Suche die Zeit des Entschlüsselns 1ms pro Datensatz sparen. Das wirft dann aber evtl. wieder andere Fragen auf. Mit mehreren Clientsinstanzen müsste man diese Liste dann vor Verwendung mit der DB Syncronisieren. Das könnte man aber z.B. mit Count() machen. Eigentlich heißt es auch in den Anforderungen die Daten sollten nur während der Verwendung entschlüsselt sein. Ist die Frage, ob man das Risiko die Daten im Speicher vorzuhalten eingehen möchte bzw. Begründen kann. Letztendlich muss man eine Balance finden zwischen Sicherheit und Verfügbarkeit.
  Mit Zitat antworten Zitat