Ich muss eine Webanwendung mit SQL Server 2005, asp.net und ado.net schreiben. Ein Großteil der in dieser Anwendung gespeicherten Benutzerdaten muss verschlüsselt werden (siehe HIPAA).
In der Vergangenheit habe ich bei Projekten, die eine Verschlüsselung erforderten, die Ver- und Entschlüsselung im Anwendungscode vorgenommen. Dabei handelte es sich jedoch in der Regel um die Verschlüsselung von Kennwörtern oder Kreditkarteninformationen, also nur um eine Handvoll Spalten in einigen Tabellen. Für diese Anwendung müssen weitaus mehr Spalten in mehreren Tabellen verschlüsselt werden, so dass ich vermute, dass eine Verlagerung der Verschlüsselungsverantwortung in die Datenschicht leistungsfähiger sein wird, insbesondere angesichts der nativen Unterstützung mehrerer Verschlüsselungstypen durch SQL Server 2005. (Ich könnte vom Gegenteil überzeugt werden, wenn jemand echte, empirische Beweise hat).
Ich habe BOL konsultiert, und ich bin ziemlich gut im Umgang mit Google. Ich möchte also keine Links zu Online-Artikeln oder MSDN-Dokumentation (wahrscheinlich habe ich sie bereits gelesen).
Ein Ansatz, den ich bis jetzt verstanden habe, ist die Verwendung eines symmetrischen Schlüssels, der mit einem Zertifikat geöffnet wird.
Die einmaligen Einrichtungsschritte sind also (theoretisch von einem DBA durchgeführt):
- Einen Hauptschlüssel erstellen
- Sichern Sie den Hauptschlüssel in einer Datei, brennen Sie ihn auf eine CD und lagern Sie ihn außer Haus.
- Öffnen Sie den Master Key und erstellen Sie ein Zertifikat.
- Sichern Sie das Zertifikat in einer Datei, brennen Sie es auf eine CD und lagern Sie es außer Haus.
- Erstellen Sie den symmetrischen Schlüssel mit dem Verschlüsselungsalgorithmus Ihrer Wahl unter Verwendung des Zertifikats.
Wenn dann eine gespeicherte Prozedur (oder ein menschlicher Benutzer über Management Studio) auf verschlüsselte Daten zugreifen muss, müssen Sie zuerst den symmetrischen Schlüssel öffnen, alle Tsql-Anweisungen oder Batches ausführen und dann den symmetrischen Schlüssel schließen.
Für die Asp.net-Anwendung und in meinem Fall für die Datenzugriffsschicht des Anwendungscodes ist die Datenverschlüsselung dann völlig transparent.
Meine Fragen lauten also:
-
Möchte ich öffnen, tsql-Anweisungen/Batches ausführen und dann den symmetrischen Schlüssel alle innerhalb der Sproc schließen? Die Gefahr, die ich sehe, ist, was, wenn etwas mit der tsql-Ausführung schief geht, und Code sproc Ausführung nie die Anweisung erreicht, die den Schlüssel schließt. Ich nehme an, dass dies bedeutet, dass der Schlüssel offen bleibt, bis Sql die SPID beendet, auf der Sproc ausgeführt wurde.
-
Sollte ich stattdessen in Erwägung ziehen, für jede auszuführende Prozedur drei Datenbankaufrufe zu tätigen (nur wenn eine Verschlüsselung erforderlich ist)? Ein Datenbankaufruf, um den Schlüssel zu öffnen, ein zweiter Aufruf, um die Sproc auszuführen, und ein dritter Aufruf, um den Schlüssel zu schließen. (Jeder Aufruf wird in eine eigene Try-Catch-Schleife eingeschlossen, um die Wahrscheinlichkeit zu erhöhen, dass ein offener Schlüssel letztendlich geschlossen wird).
-
Alle Überlegungen sollte ich Client-seitige Transaktionen verwenden müssen (d.h. mein Code ist der Client, und initiiert eine Transaktion, führt mehrere Sprocs, und dann die Transaktion unter der Annahme von Erfolg festschreiben)?