Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  4/2005
suche: 
Dieser Artikel richtet sich an Datenbankadministratoren, Anwendungsentwickler, −planer, Sicherheitsbeauftragte und Entscheider.

IBM Informix Dynamic Server 10.0 Neuheiten (Teil I):

Top Secret: "Verschlüsseln" auf Spaltenebene ...

Nach der Network Encryption (siehe ORDIX News Ausgabe 2/2004) wurde im neuesten IBM Informix Release 10.0 ein weiteres, wichtiges Security Feature implementiert, die Column Level Encryption. Zunehmend wichtiger werden die beiden Themen Datenschutz und Datensicherheit bei der Entscheidung für das richtige Datenbank Management System.

Überblick

Mit dem IBM Informix Dynamic Server Release 9.4 wurde mit der Network Encryption die Möglichkeit geschaffen, Daten, die zwischen Client und Datenbankserver transferiert werden, zu verschlüsseln. Nun besteht mit der Column Level Encryption ebenfalls die Möglichkeit, die Daten innerhalb der Datenbank auf Spaltenebene zu verschlüsseln.

Hierbei unterstützt Informix - wie bereits bei der Network Encryption - die folgenden Verschlüsselungsalgorithmen:

Mittels der Verschlüsselung auf Spaltenebene können folgende Datentypen verschlüsselt werden:

Darüber hinaus können alle Unicode Datentypen (NCHAR, NVARCHAR) verschlüsselt werden.

Architektur und Implementierung

Wie Abbildung 1 zeigt, können Daten z. B. mit einem einfachen Unix string-Kommando auf einen Informix Chunk, oder mit dem Informix Tool "oncheck" angezeigt werden. Um sicherheitsrelevante Daten nun auch innerhalb der Datenbank zu verschlüsseln, wurde die Column Level Encryption eingeführt.

informix $ oncheck -pP 3 832
addr  stamp     chksum  nslots  flag  type     frptr frcnt next     prev
3:832 70494      101c   3       801   DATA      109  1923   0         0

       slot  ptr  len  flg
         1   24    22   0
         2   46    17   0
         3   63    46   0

slot    1:
     0:  0  0  0 64  6 54 68 6f 6d 61 73  a 4d 75 73 74   ...d.Thomas.Must
    16: 65 72 6d 61 6e 6e                                 ermann..........
slot    2:
     0:  0  0  0 c8  5 4c 61 72 72 79  6 52 61 74 6c 6f   ...H.Larry.Ratlo
    16: 73                                                s...............
slot    3:
     0:  0  0  1 2c 14 30 30 69 33 2f 41 41 41 41 45 41   ...,.00i3/AAAAEA
    16: 33 72 57 42 58 47 30 38 62 14 30 6e 57 4c 2f 41   3rWBXG08b.0nWL/A
    32: 41 41 41 45 41 30 79 4d 37 34 48 76 72 69         AAAEA0yM74Hvri..

informix $ strings /informix/dev/datadbs_c01 |egrep -i "Larry|Kraxel"

Larry

Abb. 1: Informix oncheck-Kommando (-pP -> Page Dump) und Unix strings-Kommando (vergrößern!).

IBM unterstreicht auch hiermit die Synergieeffekte der beiden Datenbanksysteme Informix und DB2. So wurde nun die Verschlüsselung auf Spaltenebene im Informix Datenbankserver implementiert.

Im Gegenzug wurden und werden in DB2 auch weitere Funktionen von Informix (z. B. HADR, siehe ORDIX News 2/2005 und 3/2005) aufgenommen.

Die Column Level Encryption wurde im IBM Informix Datenbankserver als eine "built in" Funktion implementiert.

Die folgenden SQL-Befehle und Funktionen sind hinzugekommen:

Wie bei der Netzwerk Encryption bildet auch hier der OpenSSL in der Version 0.9.7.c die Grundlage.

Das Encryption Passwort

Das Encryption Passwort wird mittels des SQL-Befehls SET ENCRYPTION PASSWORD "..." gesetzt. Das Passwort muss vor jedem Aufruf einer Verschlüsselungs- bzw. Entschlüsselungsfunktion gesetzt werden.

Das Passwort, auch Passphrase genannt, muss mindestens 6 Byte, kann jedoch maximal 128 Byte betragen.

Damit sich die Passwörter besser merken lassen, besteht die Möglichkeit, einen Hinweis (Hint) für das Passwort zu vergeben. Dieser kann mit der Funktion GETHINT abgefragt werden.

Beispiel:

SET ENCRYPTION PASSWORD "schwarz" with
Hint "Meine Lieblingsfarbe?";
....
SELECT GETHINT(kd_nname) from kunde;

Die maximale Länge für einen Hint beträgt 32 Byte. Achtung, auch die Verwendung eines Hints hat enorme Auswirkung auf den tatsächlich belegten Speicherplatz innerhalb der Datenbank.

Eine weitere Möglichkeit, das Encryption Passwort zu setzen, besteht in der Verschlüsselungsfunktion selbst.

Beispiel:

ENCRYPT_AES(DATEN,PASSWORD,HINT)

Abbildung 1 zeigt ebenfalls die Ausgabe des oncheck-Kommandos, wenn ein Datensatz mittels der Verschlüsselungsfunktion eingefügt wurde (siehe 3. Datensatz-Eintrag in der Page).

Encryption/Decryption Funktionen

Mittels der Funktionen ENCRYPT_AES/ENCRYPT_TDES können die Daten mit dem jeweils verwendeten Passwort verschlüsselt werden. Die Funktionen lassen sich, wie andere auch, einfach im SQL-Statement verwenden (siehe Abbildung 2).

set encryption password "ordix123";
insert into kunde values (300,encrypt_aes("Kraxel"),encrypt_aes("Huber"));

set encryption password "ordix123";
update vertriebsprovision
   set provisions_info = encrypt_aes("4% Provision zzgl.")
   where vert_nr=4711;

Abb. 2: Encryption Passwort und Verschlüsselungsfunktionen.

In Abbildung 3 ist die Ausgabe einer "encrypted Character Column" zu sehen. Die Funktion DECRYPT_CHAR/DECRYPT_BINARY dechiffriert unter Verwendung des "richtigen" Passwortes die Spaltenwerte. Abbildung 4 zeigt die Verwendung der DECRYPT_CHAR-Funktion.

SQL: New Run Modify Use-editor
Run the current SQL statements.

------- testdb@ifx10 ------- Press CTRL-W for Help

    kd_nr     kd_vname             kd_nname

    100       Thomas               Mustermann
    200       Larry                Ratlos
    300       00i3/AAAAEA3rWBXG08b 0nWL/AAAAEA0yM74Hvri

Abb. 3: Ergebnis eines SELECT Befehls auf eine Tabelle mit einem „verschlüsselten“ Datensatz.

SQL: New Run Modify Use-editor Run the current SQL statements.

----------------------- testdb@ifx10 -----------
set encryption password "ordix123";
select kd_nname Encrypted,
decrypt_char(kd_nname) decrypt,
length(kd_nname) laenge_enc,
length(decrypt_char(kd_nname) laenge_dec
from kunde;

SQL: New Run Modify Use-editor Run the current SQL statements.

----------------------- testdb@ifx10 -----------
encrypted 0X6D/AAAAEA0N0VjusHx+DimG7POEcfHCigLtA29HY6
decrypt Mustermann
laenge_enc 43
laenge_dec 10

Abb. 4: DECRYPT_CHAR-Funktion und Speicherplatzbelegung.

Dargestellt werden chiffrierte Character Spalten im 64er Zahlensystem (alle Klein- und Großbuchstaben, die Ziffern 0 - 9 und 2 Sonderzeichen). Binary Spalten, also BLOB und CLOB Columns, werden "unencoded" dargestellt.

Auswirkungen

Die Verwendung der Column Level Encryption bietet die Möglichkeit, unternehmenskritische Daten zu schützen. Jedoch hat dies auch negative Einflüsse auf die Performance und die Speicherplatzbelegung. Die Verwendung der Encrypt-/Decrypt-Funktion geht enorm zu Lasten der Performance. Daher gilt es, die Column Level Encryption nur gezielt bei besonders "wichtigen" Unternehmensdaten einzusetzen.

Weiterhin zu beachten ist:


N = Länge/String (bytes) Encrypt_TDES (no hint) Encrypt_AES (no hint) Encrypt_TDES (with hint) Encrypt_AES (with hint)
1 to 7 35 43 87 99
8 to 15 43 43 99 99
16 to 23 55 67 107 119
24 to 31 67 67 119 119
32 to 39 75 87 131 139
40 to 47 87 87 139 139
100 163 171 215 227
200 299 299 355 355
500 695 707 747 759
Abb. 5: Speicherplatzbelegung unter Verwendung der Encrypt-Funktion.

Weitere Auswirkungen hat die Column Level Encryption auf die Speicherplatzbelegung. Der belegte Speicherplatz innerhalb der Datenbank nimmt um ein Vielfaches zu (siehe Abbildung 5).

Die Funktion LENGTH gibt hierbei Einsicht auf die belegten Bytes innerhalb der Datenbank. Einen nicht unwesentlichen Faktor auf die Speicherplatzbelegung liefert die Verwendung eines "Hints".

Besondere Vorsicht ist bei zu klein dimensionierten Character Spalten gegeben. Auch der INSERT eines verschlüsselten Wertes wird am Ende einfach abgeschnitten, falls die Spalte nicht den gesamten Wert aufnehmen kann. Dieses hat jedoch zur Folge, dass dieser Wert nie mehr entschlüsselt werden kann, da wichtige Key-Teile abgeschnitten wurden.

Der Datenbankserver gibt bei einem INSERT auf eine zu klein dimensionierte Spalte keine Fehlermeldung zurück! Ob es sich hierbei um ein Feature oder einen BUG handelt, sollten Sie selbst entscheiden. :-)

Somit ist die Dimensionierung der entsprechenden Spalten besonders wichtig. Zur Berechnung kann die in Abbildung 6 gezeigte LENGTH Funktion verwendet werden.

SELECT LENGTH(ENCRYPT_AES("TEST","ordix123"))
FROM SYSTABLES
WHERE TABID=1;

Abb. 6: LENGTH-Funktion zur Berechnung des belegten Speicherplatzes.

Fazit

Die Einführung der Column Level Encryption ist ein weiterer, wichtiger Meilenstein für den Informix Dynamic Server. Die Implementierung wurde, wie immer, anwenderfreundlich gestaltet.

Nach unseren ersten Erfahrungen hinterlässt das neueste IBM Informix Dynamic Server Release 10.0 einen sehr stabilen Eindruck.

Weitere Neuerungen und auch Erfahrungsberichte des Informix Dynamic Servers lesen Sie in einer der nächsten ORDIX News Ausgaben.

Haben Sie bereits vorab weitere Fragen rund um Ihr Informix Datenbank System oder möchten Sie weitere Detailinformationen zu einem bestimmten Thema? Dann sprechen Sie uns einfach an!

Guido Saxler (info@ordix.de).