Daten werden verschlüsselt und mit Prüfsummen versehen übertragen und gespeichert, um zu verhindern, dass Unbefugte sie lesen oder verändern. Der Kreis der Unbefugten beginnt bei Hackern, die den Netzwerkverkehr mittels Sniffer kompromittieren, und reicht über System- oder Storage-Administratoren bis hin zu Personen, die Zugriff auf entsorgte oder gestohlene Festplatten haben. Oracle Database 11g Enterprise Edition
mit der Advanced Security Option
(ASO) verschlüsselt das Netzwerk, deklarativ beliebige Daten in der Datenbank mit der sogenannten Transparent Data Encryption
(TDE) sowie Backups und Dump-Files. In allen Editionen der Datenbank steht zur verschlüsselten Speicherung von Daten auf der Festplatte ausserdem das Package DBMS_CRYPTO
zur Verfügung. Das Arbeiten mit dem Package ist zwar umständlicher als das Arbeiten mit der Transparent Data Encryption
, bietet aber auch Anwendern die Möglichkeit zu verschlüsseln, die die Investition in die Enterprise
-Edition plus Advanced-Security
-Option scheuen. Das Schlüsselmanagement erfordert extreme Sorgfalt, denn beim Verlust des Schlüssels ist kein Zugriff auf die verschlüsselten Daten mehr möglich. Hier wird der Schlüssel in einer eigenen Tabelle gespeichert. Der Schlüssel hat nur für einen bestimmten Zeitraum Gültigkeit. Das Anlegen einer Tabelle zur Speicherung der Schlüssel erfolgt über die nachfolgende Anweisung:
CREATE TABLE schluesseltabelle (schluessel RAW(300) NOT NULL,
startdatum DATE NOT NULL, enddatum DATE);
Mit einem weiteren Befehl wird der Schlüssel für den ersten Zeitraum eingefügt:
INSERT INTO schluesseltabelle (schluessel, startdatum) VALUES
(SYS.DBMS_CRYPTO.RANDOMBYTES(32), to_date('JAN-01-2009',
'MON-DD-YYYY'))
Bei Bedarf wird durch ein UPDATE auf den erzeugten Datensatz ein Enddatum 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 Funktion erreicht, die auf DBMS_CRYPTO
zugreift. Die Funktion ermöglicht das Verschlüsseln sowohl beim INSERT
als auch beim UPDATE
.
CREATE OR REPLACE FUNCTION crypt (eingabe IN VARCHAR2)
RETURN RAW IS rohdaten RAW(200);
schluessel RAW(32); verschluesselung PLS_INTEGER :=
DBMS_CRYPTO.ENCRYPT_AES256 +
DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO;
BEGIN SELECT schluessel INTO schluessel FROM schluesseltabelle
WHERE sysdate BETWEEN startdatum AND nvl(enddatum, sysdate);
rohdaten := DBMS_CRYPTO.ENCRYPT(src => UTL_I18N.STRING_TO_RAW
(eingabe, 'AL32UTF8'), typ => verschluesselung, key => schluessel);
RETURN rohdaten; END;
Zu erläutern ist hier der Parameter SRC
: DBMS_CRYPTO
arbeitet ausschließlich mit den Datentypen LOB, CLOB und RAW. Daten vom Typ VARCHAR2 sind deshalb zu konvertieren. Dies geschieht mit dem Package UTL_I18N, das auch den Zielzeichensatz (AL32UTF8) angibt. Ein INSERT
in eine Tabelle sieht etwa so aus:
INSERT INTO tabelle (...) VALUES (..., crypt('eintest'), ...)
Der lesende Zugriff wird über eine eigene Funktion gesteuert, die analog zur bereits angeführten CREATE-OR-REPLACE-Funktion zu erstellen ist. Abschließend sollte der Quellcode der Funktionen beispielsweise mit dem Hilfsprogramm WRAP geschützt werden. Die nachfolgende Anweisung zeigt den Aufruf, wobei in DATEINAME.SQL jeweils das Statement steht, mit dem die Funktion zum Ver- beziehungsweise Entschlüsseln angelegt wird:
wrap iname=dateiname.sql
(Ulrike Schwinn/Heinz-Wilhelm Fabry/am)
datenbanken
Weitere News:
Coole Sache?
codekicker.de braucht deine Hilfe: Like uns und klicke auf den +1-Button!
databasepro
databasepro berichtet alle zwei Monate praxisnah über die Themen, die professionelle Datenbank-Architekten, -Administratoren, Consultants, Anwender und IT-Manager, die sich mit der Auswahl von Technologien, Plattformen, Datenbanken und Entwicklungsumgebungen beschäftigen, Tag für Tag brauchen.