Arbeiten mit DBMS_CRYPTO
von Heinz-Wilhelm Fabry, ORACLE Deutschland GmbH
Das ältere DBMS_OBFUSCATION_TOOLKIT unterstützt lediglich zwei inzwischen als weniger sicher eingestufte und ausserdem wenig performante Verschlüsselungsalgorithmen (DES und 3DES). Deshalb ist von der Verwendung dieses Package abzuraten. Stattdessen sollte DBMS_CRYPTO verwendet werden.
DBMS_CRYPTO ist Teil des Schema SYS. Voraussetzung für seine Verwendung ist die Ausführungsberechtigung, die natürlich über ein GRANT EXECUTE erteilt wird.
In konkreten Projekten betrifft die wichtigste Entscheidung für das Arbeiten mit DBMS_CRYPTO den Umgang mit dem Schlüssel oder den Schlüsseln für die Verschlüsselung. Drei Vorgehensweisen sind möglich.
1. Der oder die Schlüssel werden in der Datenbank gespeichert. Denkbar wäre, den oder die Schlüssel in einer separaten Spalte der Tabelle abzulegen, die auch die zu verschlüsselnden Daten enthält. Die Speicherung kann alternativ in einer eigenen Tabelle erfolgen. So ist es möglich, Schlüssel zu verwenden, die für unterschiedliche Zeiträume gelten oder die für jeden Datensatz unterschiedlich sind. Für beide Fälle muß natürlich die passende Form der Verknüpfung gewählt werden - also z.B. eine Verknüpfung über ein in dem Datensatz enthaltenes Datumsfeld oder eine Primär-Fremdschlüsselverknüpfung mit der Datentabelle.
Problematisch bei diesen Vorgehensweisen ist, dass privilegierten Benutzern, also z.B. Datenbankadministratoren, der Zugriff auf diese Schlüssel und damit auf die verschlüsselten Daten nicht zu entziehen ist.
2. Der oder die Schlüssel werden in einer Betriebssystemdatei abgelegt, die im Rahmen der Ver- bzw. Entschlüsselung gelesen wird. Auch hier liegt die Problematik in der Absicherung der Schlüssel gegen unbefugte Zugriffe, denn privilegierte Betriebssystemnutzer könnten die Datei jederzeit lesen.
3. Schließlich können die Schlüssel durch die Benutzer selbst verwaltet werden. Hier besteht allerdings die Gefahr, dass Schlüssel entweder vergessen werden - mit der Folge, dass der Zugriff auf die verschlüsselten Daten endgültig verloren geht - oder dass die Schlüssel und damit die verschlüsselten Daten durch ungeeignete Ablagen (Post-Its am Arbeitsplatz!) kompromittiert werden. Aber auch die Eingabe (Keylogger, Beobachtung der Eingabe!) und Übertragung der Schlüssel im Netzwerk (verschlüsselt?) könnten zum Sicherheitsproblem werden.
Für das Beispiel in diesem Beitrag wird auf die erste der genannten Möglichkeiten zurückgegriffen: Speicherung der Schlüssel in einer eigenen Tabelle. Die Schlüssel sollen nur für einen bestimmten Zeitraum Gültigkeit haben. Die Tabelle für die Schlüssel wird mit folgendem Befehl angelegt
In diese Tabelle wird mit folgendem Befehl der Schlüssel für den ersten Zeitraum eingefügt
Bei Bedarf wird durch ein UPDATE auf den erzeugten Datensatz ein Enddatum eingefügt und durch ein INSERT ein neuer Satz mit einem neuen Schlüssel für den nächsten Zeitraum eingefügt.
Das Verschlüsseln der Daten wird über eine eigene Funktion erreicht, die auf das Package DBMS_CRYPTO zurückgreift. Damit ist es leicht möglich, sowohl beim INSERT als auch beim UPDATE zu verschlüsseln.
Erläuterungsbedürftig ist hier nur die Verwendung des Parameter SRC: Da DBMS_CRYPTO nur mit den Datentypen LOB, CLOB und RAW arbeitet, müssen Daten vom Typ VARCHAR2 konvertiert werden. Dies geschieht hier durch Rückgriff auf das Package UTL_I18N, das verlangt, auch den Zielzeichensatz (AL32UTF8) anzugeben.
Das INSERT in eine Tabelle könnte nun also etwa folgendermaßen aussehen
Der lesende Zugriff wird über eine eigene Funktion gesteuert.
Das SELECT greift auf die verschlüsselte Spalte folgendermaßen zu
Es empfiehlt sich, den Quellcode der Funktionen z.B. mit der Utility WRAP zu schützen. In der Datei DATEINAME.SQL steht jeweils das Statement, mit dem die Funktion zum Ver- bzw. Entschlüsseln angelegt wird.
Damit sind die im Quellcode enthaltenen Informationen nicht mehr einfach zugänglich.
Abschließend sei darauf hingewiesen, dass der Einsatz der Transparent Data Encryption aus der Advanced Security Option wesentlich komfortabler ist: Zunächst übernimmt die Datenbank das komplette Schlüsselmanagement, und die Festlegung, welche Spalten oder Tablespaces verschlüsselt werden, erfolgt im Rahmen der DDL-Statements CREATE / ALTER TABLE und CREATE TABLESPACE.
Zurück zur Community-Seite
|