| 

.NET C# Java Javascript Exception

9
Ich suche eine Idee, wie ich sicherstellen kann, dass die Zeilen in bestimmte Tabellen nach einem bestimmten Zeitpunkt nicht mehr verändert wurden - auch nicht von mir als "Entwickler".

Ich habe eine Zeiterfassungsanwendung erstellt. Auf Basis dessen werden die Gehälter gezahlt. Bis zu einem bestimmten zeitpunkt dürfen Daten noch geändert werden. Aber ab dem Tag X, geht das über die Anwendung nicht mehr.

Da ich die Anwendung geschrieben habe, weiß ich welche Tabellen die Stunden enthalten und welche GUID "meine" ist - also ratz fatz mit SQL Manager die DB angezogen und meine Überstunden angepasst.

Das soll ich zukünftig nicht mehr dürfen *Warum wohl* *grins*

Alle Ideen, die ich dazu habe, sind irgentwie recht lückenhaft. Wenn ich z.B. ein neues feld einbaue, wo eine Prüfsumme reinkommt, dann brauch ich mir nur ein Tool schreiben, was die Prüfsumme mit meinen Überstunden versieht - dann ändere ich nicht nur die Stunden, sondern auch noch die Prüfsumme.

Daher die Frage: Wie machen dass resivionssichere Datenbankanwendungen. Denn wenn ich steuern kann, wie die Prüfungsmechanismen gehen, kann ich sie wohl auch "umgehen".

Vielleicht hat ja jemand eine Idee dazu

PS: Nur zur Klärung - ich habe meine Überstunden natürlich NIE nachträglich geändert. Es geht mir hier auch eher um die Vorgehensweise und nicht um ein konkretes Beispiel. Außerdem ist die "Arbeitszeiterfassungs-Anwendung" nur als Beispiel genannt, um mein Problem zu verdeutlichen.
04.07.2012
MyKey0815 1,2k 8
4 Antworten
2
Wenn du in die Checksumme immer die Checksumme des vorherigen Eintrags einbeziehst, ist es nicht möglich die Daten zu ändern.

Ein Beispiel:

Datum____ Beginn Ende_ Mitarbeiter_____ CheckSum
--------------------------------------------------------
01.01.2012 | 08:00 | 17:30 | Mustermann M. | 0f765b3
02.01.2012 | 08:00 | 16:45 | Andere Mitarbe. | 5g5646c = (checksumme(currentrow + 0f765b3))
02.01.2012 | 07:30 | 16:50 | Mustermann M. | 17ff904 = (checksumme(currentrow + 5g5646c ))
....

Um eine Manipulation vorzunehmen, müsstest du alle nachfolgenden Checksummen neu berechnen.
04.07.2012
Floyd 13,4k 3 9
Floyd 13,4k 3 9
Gute Idee. Dazu müsste ich dann aber immer den letzten eingefügten Datensatz zunächst ermitteln, bevor ich den neuen Datensatz schreibe. Ich verwende als FK immer eine zufällig erzeugte GUID, daher ist das sortieren wohl nicht die ideale Lösung. Aber dennoch finde ich deinen Ansatz echt gut.
MyKey0815 04.07.2012
1
Wenn du einen Timestamp als CreateDate mitführst, kannst du daran sortieren.
Floyd 05.07.2012
2
Wenn der Entwickler aber "weiß" wie die Checksummenberechnung erfolgt: Was spricht dagegen, dass er mit einem Tool eine entsprechende Neuberechung (aller DB-Einträge) durchführt? Ich steh ein bisschen auf dem Schlauch :)
puls200 05.07.2012
Kryptografisch sichere Checksummen (auch Hash's) kannst du nicht mal eben für ein paar hundert oder tausend Datensätze neu berechnen.

Der Aufwand steigt exponenzial mit der Anzahl der Runden die innerhalb des Algorithmus gedreht werden.
Sollte eine Berechnung für eine Checksumme z.b. nur 10 Sekunden dauern, so dauert es bei 1000 Einträgen bereits 2,777 Stunden.
Im Ereignisslog (Beginn Arbeitszeit, Beginn Pause, ...) bei uns auf Arbeit sind in den letzten 5 Jahren bereits 500.000 Einträge entstanden. Diese alle neu zu berechnen würde 57 Tage (~ 2 Monate) dauern.
Floyd 05.07.2012
Und 10 Sekunden ist für ein einen Hash nicht sonderlich viel.
Floyd 05.07.2012
Letztendlich kann man die Grundidee auch weiter ausbauen, so wie du es in deinem Post getan hast.

Das einfügen einen zusätzlichen Salts, die Hash/Checksum basierend auf dem vorherigen UND nachfolgendem Datensatz erzeugen .....
Floyd 05.07.2012
1
Dann bleibt aber die Schwierigkeit, dass du beim Löschen eines Datensatzes alle darauffolgenden Checksummen ungültig werden und neu berechnet werden müssten.
puls200 05.07.2012
1
Richtig, löschen ist nicht erlaubt .. nur "Gelöscht"-Flags wären möglich.
Floyd 05.07.2012
2
Ich würde ein externes Tool erstellen, dass Prüfsummen aus einzelnen Datenbankzeilen erstellt und in eine separate Spalte schreibt. Dieses Tool läuft dann als Job zum Zeitpunkt X. Die Prüfsummenberechnung enthält einen veränderbaren Anteil (Salt), der nur dem Admin (oder wer auch immer autorisiert ist) bekannt ist, so dass Dritte nicht in der Lage sind, eine Neuberechnung durchzuführen, selbst wenn sie Zugriff auf das Tool haben.
Um eine Manipulation zu erkennen braucht man das Tool nur erneut zum Abrechnungszeitpunkt auszuführen und die Zeilen mit abweichender Checksumme identifizieren.
05.07.2012
puls200 3,7k 6
Interessanter Ansatz. Man müsste dann den veränderlichen Teil zumindestens für die autm. Durchläufe irgentwo hinterlegen - dass könnte ich als Entwickler dann ja auch wieder auslesen - den Salt mir anzeigen und dann eine Neuberechnung laufen lassen. (Wenn ich das richtig verstanden habe)

MyKey0815 05.07.2012
Klar - eine gewisse kriminelle Energie muss dahinter stehen. Nur als Entwickler des Tools hat man deutlich weniger Aufwand so einen Hack zu bauen, weil man ja den Code selber gebaut hat. Jemand der den Code/Vorgehensweise nicht kennt, ist da natürlich mit viel mehr Aufwand dran.

So wie ich das sehe, ist es wie das Admin/root Passwort eines Systems. Derjenige der es kennt, kann alles machen. Ob er es aber auch macht und letztendlich für sich ausnutzt, liegt in der Person als solches
MyKey0815 05.07.2012
So ist es. Im Prinzip sollte es immer so sein, dass der Sicherheitsmechanismus der potentiellen Bedrohung in einem vernünftigen Verhältnis gegenübersteht. Bei meinem Vorschlag könnte man den Salt Anteil einfach manuell eingeben oder aus einem geg. Vorrat (wie eine TAN) schöpfen.
puls200 05.07.2012
1
Man könnte mit dem Ansatz auch statt der Prüfsumme die Datensätze mit einer Signatur versehen.
Dann muss nur sichergestellt werden, dass nur berechtige Personen (z.B. Buchaltung, Geschäftsführung) zugriff auf den geheime Schlüssel für das Signieren haben. Da man PKs eh mit einem sicheren Passwort schützen sollte ist das aber auch kein großes Problem.
phg 05.07.2012
2
Wenn ich das wirklich nachweislich Revisionssicher machen wollte, würde ich wie folgt vorgehen:
Die Daten am Tag X in ein File exportieren und dieses auf ein (oder zwei) WORM Medium schreiben. Dieses kommt dann beim Chef in den Safe. Sollte es dann Klärungsbedarf geben, kannst Du auf die Daten im Safe verweisen.
05.07.2012
Jaksa 3,2k 1 8
2
Einen Trigger schreiben der die unerwünschten Änderung abfängt und den Trigger selbst mit einem DDL Trigger, der bei Änderung eines Triggers oder des Datenbankschemas ein Mail an den "Chef" schickt (oder eine andere unwiederrufbare Aktion ausführt), vor heimlichen Änderungen schützen... (Ich hab zwar keine Erfahrung mit DDL Triggern, aber das sollte gehen...)
05.07.2012
MaHop 21 1

Stelle deine Datenbank-Frage jetzt!