Die Datenverschlüsselung ist sehr wichtig, da sie eine Möglichkeit darstellt, die aktuellen und archivierten Daten zu schützen, um deren Vertraulichkeit zu gewährleisten. Dies verhindert einen unbefugten Zugriff und eine Nutzung. In diesem Artikel werde ich einige wichtige Aspekte der Datenverschlüsselung und -entschlüsselung kurz vorstellen.
Verschlüsselungssysteme
In einem Verschlüsselungssystem gibt es zwei Hauptkomponenten:den Verschlüsselungsalgorithmus das ist die Methode, mit der der Wert geändert wird, und den Verschlüsselungsschlüssel , deren Sicherheit von der Anfälligkeit der verschlüsselten Daten abhängt.
Oracle unterstützt zwei Arten von Verschlüsselungsalgorithmen:symmetrische Algorithmen (denselben Schlüssel zum Verschlüsseln und Entschlüsseln von Daten verwenden) zum Verschlüsseln gespeicherter Daten und asymmetrischer Algorithmen (Es werden 2 Schlüssel generiert:ein privater Schlüssel zur Entschlüsselung und ein öffentlicher Schlüssel, der vom Absender der Nachricht verwendet wird, um die Nachricht zu verschlüsseln) zur Datenbankanmeldung und zur Kommunikation zwischen einer Datenbank und einem Client.
Folgende symmetrische Verschlüsselungsalgorithmen sind in Oracle verfügbar:Data Encryption Standard (DES ), das einen Block von 64 Bit des Textes in 64 Bit des verschlüsselten Textes verschlüsselt, unter Verwendung eines Schlüssels von 56 Bit, Triple Data Encryption Standard (3-DES ), eine erweiterte Version von DES und Advanced Encryption Standard (AES ), das einen Block von 128 Bit des Textes in 128 Bit des verschlüsselten Textes verschlüsselt, wobei ein Schlüssel von 128.129 oder 256 Bit verwendet wird.
Man kann feststellen, dass die oben genannten Verschlüsselungsalgorithmen Blöcke mit fester Größe verwenden, und daher wird der zu verschlüsselnde Text in Blöcke mit einer bestimmten Größe unterteilt, die vom verwendeten Algorithmus benötigt wird, und dann wird der Algorithmus auf jeden erhaltenen angewendet blockieren.
Was aber, wenn die Datendimension kein Vielfaches der erforderlichen Dimension des Blocks ist? Die Fülltechnik verwendet werden, um das letzte Segment des Textes zu füllen, bis es die Dimension eines Blocks erreicht. Man kann wählen, ob man mit Nullen auffüllen oder das Padding-Schema namens PKCS#5 verwenden möchte. Das Schema berechnet die Differenz für das letzte Textsegment
d =dim_block – dim_data MOD dim_block
und füllt jedes fehlende Byte mit dem Hexawert 0x0d ,
wo dim_block ist die Dimension in Bytes für den Block, die vom Algorithmus benötigt wird
und füllt jedes fehlende Byte mit dem Hexawert 0x0d ,
wo dim_block ist die Dimension in Bytes für den Block, die vom Algorithmus benötigt wird
Was aber, wenn der Klartext aus mehreren zu verschlüsselnden Blöcken besteht? Die Verkettungstechnik verwendet, der festlegt, ob die Verschlüsselung eines Blocks von der Verschlüsselung der vorherigen Blöcke abhängig ist oder nicht.
Die folgenden Verkettungsarten sind verfügbar in Oracle:
- Elektronisches Codebuch (CHAIN_ECB):Jeder Block wird unabhängig von den restlichen Blöcken verschlüsselt. Der Nachteil ist, dass man sich wiederholende Muster im Textfragment erkennen kann.
- Cipher Block Chaining (CHAIN_CBC):Für jeden Block wird vor der Verschlüsselung ein XOR-Operator mit einem Vektor angewendet. Für den ersten Block aus der Sequenz wird ein Initialisierungsvektor verwendet, während für einen Block aus dem Rest der Sequenz das Verschlüsselungsergebnis des vorherigen Blocks als Bitvektor verwendet wird
- Cipher-Feedback (CHAIN_CFB):Bei CBC ist es ähnlich, außer dass der XOR-Operator nach der Blockverschlüsselung angewendet wird.
- Feedback ausgeben (CHAIN_OFB):Es ist ähnlich wie bei CFB, außer dass das Ergebnis des vorherigen Blocks verschlüsselt wird, bevor der XOR-Operator angewendet wird
Um Daten zu verschlüsseln und zu entschlüsseln, können wir das in ORACLE verfügbare DBMS_CRYPTO-Paket verwenden. Um dieses Paket zu verwenden, muss SYSDBA Benutzern Ausführungsrechte erteilen, indem der Befehl verwendet wird:
GRANT EXECUTE ON dbms_crypto TO username;
Für die Verschlüsselung dbms_crypto.encrypt verwendet, die die folgenden Parameter hat:
dbms_crypto.encrypt( clear_text IN RAW, operating_mode IN PLS_INTEGER, key IN RAW, initialization_vector IN RAW DEFAULT NULL) RETURN RAW;
Für die Entschlüsselung dbms_crypto.decrypt verwendet, die die folgenden Parameter hat:
dbms_crypto.decrypt( clear_text IN RAW, operating_mode IN PLS_INTEGER, key IN RAW, initialization_vector IN RAW DEFAULT NULL) RETURN RAW;
Eine Betriebsart wird gebildet aus:
Algorithmuscode + Füllcode + Verkettungscode
Hier sind einige Beispiele für das Verschlüsseln und Entschlüsseln von Daten:
create or replace PROCEDURE encryption(text IN VARCHAR2, encrypted text OUT VARCHAR2) AS raw_set RAW(100); raw_password RAW(100); encryption_result RAW(100); encryption_password VARCHAR2(100) := '[email protected]%5,:QxV'; operation_mode NUMBER; BEGIN raw_set:=utl_i18n.string_to_raw(text,'AL32UTF8'); raw_password := utl_i18n.string_to_raw(encryption_password,'AL32UTF8'); operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB; encryption_result:=DBMS_CRYPTO.ENCRYPT(raw_set,operation_mode,raw_password); dbms_output.put_line(encryption_result); encryptedtext := RAWTOHEX (encryption_result); END; variable result_encryption varchar2(200) exec encryption('Text to be encrypted', :result_encryption); print result_encryption
create or replace PROCEDURE decryption (encrypted_text IN VARCHAR2, decrypted_text OUT VARCHAR2) AS raw_set RAW(100); raw_password RAW(100); decryption_result RAW(100); decryption_password VARCHAR2(100) := '[email protected]%5,:QxV'; operation_mode NUMBER; BEGIN raw_set:=HEXTORAW(encrypted_text); raw_password :=utl_i18n.string_to_raw(decryption_password,'AL32UTF8'); operation_mode:=DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.PAD_ZERO + DBMS_CRYPTO.CHAIN_ECB; decryption_result:=DBMS_CRYPTO.DECRYPT(raw_set,operation_mode,raw_password); dbms_output.put_line(decryption_result); decrypted_text := utl_i18n.raw_to_char (decryption_result,'AL32UTF8'); END; variable result_decryption varchar2(200) exec decryption(:result_encryption,:result_decryption) print result_decryption
Herausforderungen bei der Datenverschlüsselung
Verwaltung von Verschlüsselungsschlüsseln für Daten
Für die Datenbankbenutzer ist es schwierig, effiziente Verschlüsselungsschlüssel manuell zu generieren, die die erforderliche Länge für den Verschlüsselungsalgorithmus haben. Bei der manuellen Bereitstellung des Verschlüsselungsschlüssels als String-Set (dann in RAW umgewandelt) wird die Länge des Sets nach folgender Formel berechnet:
L_set =Length_key_in_bits / 8 (Zeichen)
Zum Beispiel hat der Schlüssel für ENCRYPT_AES128 128 Bits und der Satz hat die Länge L_set =128/8 =16 Zeichen.
Wenn der Schlüssel „1234567890123456“ angegeben wird, wird er akzeptiert, während der Schlüssel „1234“ die Ausnahme „Schlüssellänge zu kurz“ auslöst.
Für die restlichen Algorithmen gibt die folgende Tabelle die effektive Schlüssellänge an:
Schlüsselgenerierung und -übertragung
Daten werden sicher verschlüsselt, solange der zum Verschlüsseln verwendete Schlüssel sicher ist. Daher muss der Verschlüsselungsschlüssel sicher generiert werden. Das Funktionspaket RANDOMBYTES von DBMS_CRYPTO bietet eine sichere Zufallszahlengenerierung und implementiert den Zufallszahlengenerator-Algorithmus. Entwickler dürfen das DBMS_RANDOM-Paket nicht verwenden, da es Pseudo-Zufallszahlen generiert, was zu Pseudo-Sicherheit führen kann.
Die RANDOMBYTES-Funktion wird wie folgt verwendet:
key RAW (nr_bytes);
key:=DBMS_CRYPTO.randombytes (nr_bytes);
wobei nr_bytes die Anzahl der Bytes des Verschlüsselungsschlüssels darstellt
Wenn der Schlüssel von einer Anwendung an die Datenbank übergeben wird, muss er verschlüsselt werden, damit er bei der Übertragung nicht gestohlen werden kann. Oracle Advanced Security bietet Netzwerkverschlüsselung, die die Daten und die kryptografischen Schlüssel bei ihrer Netzwerkübertragung schützt.
Sobald die Schlüssel generiert sind, müssen sie sicher aufbewahrt werden, da ihre Offenlegung die Sicherheit der verschlüsselten Daten gefährden könnte. Es gibt drei Möglichkeiten, den Schlüssel zu behalten:
- auf Datenbankebene:gespeichert in der Datenbank (in einer speziellen Tabelle) oder in einer externen Datenbankdatei
- auf Datensatzebene:gespeichert in der Datenbank (in einer speziellen Tabelle)
- eine Kombination zwischen den beiden vorherigen Typen:Es gibt einen Hauptschlüssel auf Datenbankebene und für jeden Datensatz gibt es einen Schlüssel. Sowohl für die Verschlüsselung als auch für die Entschlüsselung wird ein hybrider Schlüssel verwendet:hybrid_key =master_key XOR record_key (für die XOR-Funktion gibt es eine PL/SQL-Funktion – UTL_RAW.bit_xor).
Was ist der effizienteste Schlüssel? Es ist der Hybridschlüssel. Wenn die gesamte Datenbank gestohlen wird, können die Daten nicht entschlüsselt werden, wenn der Hauptschlüssel im Dateisystem gespeichert ist. Wenn der Hauptschlüssel oder ein Schlüsseldatensatz gestohlen wird, bleibt der Rest des Datensatzes weiterhin geschützt.
Transparente Datenverschlüsselung (TDE)
Eine weitere von Oracle angebotene Sicherheitsfunktion ist die Transparent Data Encryption (TDE) , eine von Oracle 10g verfügbare Einrichtung. TDE ermöglicht das Deklarieren einer verschlüsselten Spalte auf Tabellenebene der Datenbank. Beim Einfügen von Daten in die verschlüsselte Spalte verschlüsselt Oracle die Daten automatisch und speichert ihre Verschlüsselung in der Datenbank.
Jede SELECT-Abfrage entschlüsselt automatisch die Daten. Es ist wichtig, daran zu denken, dass die Transparent Data Encryption macht keinen Unterschied zwischen Benutzern und gibt die entschlüsselten Daten unabhängig davon aus, wer die Datenbank abfragt. Nicht jede Spalte kann mit TDE verschlüsselt werden:Spalten aus dem externen Schlüssel (Fremdschlüssel) können mit dieser Methode nicht verschlüsselt werden.
Beispiel:Betrachten Sie eine Tabelle namens ACCOUNT mit dem relationalen Schema ACCOUNT (ID_Kontonummer, Kartenserie, Besitzer, Betrag), wobei ID_Konto als Primärschlüssel betrachtet wird, der durch das Zeichen „#“ gekennzeichnet ist. Nehmen wir an, wir möchten die card_series deklarieren und Guthaben Spalten verschlüsselt werden. Dies kann folgendermaßen erfolgen:
ALTER TABLE accont MODIFY (card_series ENCRYPT USING 'AES128'); ALTER TABLE accont MODIFY (balance ENCRYPT USING 'AES128');
Damit diese Methode funktioniert, muss ein Wallet erstellt und konfiguriert werden.
Warum funktioniert Transparent Data Encryption die Entschlüsselung von Daten verhindern, falls die Datenbank gestohlen wird? Nun, alle verschlüsselten Spalten einer Tabelle T verwenden denselben privaten Schlüssel Key_T. Wenn wir mehr Tabellen haben, ,…, die verschlüsselte Spalten haben, dann gibt es n private Schlüssel, Key_,…,Key_. Jeder private Schlüssel Key_, j=1,n wird mit dem Hauptschlüssel Key_Master verschlüsselt, und das Ergebnis dieser Verschlüsselung wird im Datenwörterbuch gespeichert. Der Hauptschlüssel wird extern in einem Wallet gespeichert.
Sehen wir uns nun die Schritte für diese automatische Verschlüsselung an. Sie sind:
- Beziehen des Master Key_Master aus der externen Wallet
- Entschlüsselung des privaten Schlüssels Key_ mit dem Hauptschlüssel
- Verschlüsselung der einzufügenden Daten mit dem privaten Schlüssel Key_
- Speichern der verschlüsselten Daten in den Tabellenspalten
Die Schritte für die automatische Entschlüsselung sind:
- Abrufen des Hauptschlüssels Key_Master aus der externen Brieftasche
- Entschlüsselung des privaten Schlüssels Key_ mit dem Hauptschlüssel
- Entschlüsselung der Daten mit dem privaten Schlüssel Key_
- Rückgabe des Ergebnisses
Wie sieht es mit der Datenintegrität beim Verschlüsseln aus? Hier verwenden wir die Hashing-Technik.
Hashen
Die Datenverschlüsselung gewährleistet die Vertraulichkeit von Daten, garantiert jedoch nicht deren Integrität. Um dieses Problem zu vermeiden, können wir neben der Tatsache, dass nur Originaldaten verschlüsselt werden sollten, eine Technik namens Hashing verwenden . Es gibt zwei wichtige Vorteile:Es erlaubt keine Entschlüsselung der ursprünglichen Werte und es ist deterministisch (was bedeutet, dass es bei wiederholter Anwendung auf dieselben Daten dasselbe Ergebnis erzeugt). Oracle erlaubt die folgenden Hash-Algorithmen:MD5 und SHA-1.
Verwendung:
DBMS_CRYPTO.Hash ( original_set IN RAW, operation_mode IN PLS_INTEGER) RETURN RAW; where operation_mode is either DBMS_CRYPTO.HASH_MD5 or DBMS_CRYPTO.HASH_SH1
Beispiel:
set serveroutput on DECLARE credit_card_no VARCHAR2(19) := '1234-5678-1234-5678'; credit_card_no_raw RAW(128) := utl_raw.cast_to_raw(credit_card_no); encrypted_raw RAW(2048); BEGIN encrypted_raw:=dbms_crypto.hash(credit_card_no_raw, dbms_crypto.hash_md5); dbms_output.put_line('MD5: ' || encrypted_raw); END;
Indizierte Daten verschlüsseln
Es wird Entwicklern nicht empfohlen, indizierte Daten zu verschlüsseln. Wenn ein Index einer Spalte verschlüsselte Werte enthält, kann der Index zur einfachen Überprüfung verwendet werden und ist für andere Zwecke unbrauchbar.
Angenommen, ein Unternehmen verwendet die persönliche Identifikationsnummer für die Mitarbeiternummer, die in einer Datenbanktabelle gespeichert ist. Offensichtlich werden diese Nummern als sensible und vertrauliche Daten betrachtet und das Unternehmen möchte die Spalte verschlüsseln, in der sie gespeichert sind. Da diese Spalte eindeutige Werte enthält, kann ein Index darauf ausgeführt werden, um eine bessere Leistung zu erzielen. Das bedeutet, dass der Index verschlüsselte Daten enthält und praktisch unbrauchbar wäre.
Schlussfolgerung
Abschließend ist es sehr wichtig, sensible Daten durch Ver- und Entschlüsseln zu schützen. Diesem Aspekt sollte man sich bewusst sein und die Datenbanksicherheit entsprechend implementieren.
Referenzen:
- Entwicklung von Anwendungen mit Datenverschlüsselung
- Feuerstein Steven (2009) Oracle PL/SQL Programming (5. Auflage). O’Reilly Publishing. ISBN 978-0-596-51446-4. Kapitel 23 „Anwendungssicherheit und PL/SQL“
- Betriebsart der Blockverschlüsselung