encrypt() und decrypt() (Funktionen)

Die Funktionen encrypt() und decrypt() verschlüsseln oder entschlüsseln einen varchar- oder nvarchar-Wert unter Verwendung eines bereitgestellten Schlüssels.

Verschlüsselung ist ein Prozess zur Umwandlung von Daten mit dem Ziel, deren Geheimhaltung zu wahren; die Daten können (unverschlüsselt) nur gelesen werden, wenn der Empfänger über den erforderlichen Schlüssel verfügt. Die Netezza Performance Server verwendet symmetrische Verschlüsselung. Dieser Verschlüsselungstyp wird auch als Verschlüsselung mit privatem oder geheimem Schlüssel bezeichnet, da zum Verschlüsseln und Entschlüsseln der Daten derselbe geheime Schlüssel verwendet wird. Dies bedeutet, dass dieser geheime Schlüssel auf allen Servern verfügbar gemacht werden muss, die zuvor verschlüsselte Daten entschlüsseln. Sie können auswählen, welchen Algorithmus für die symmetrische Verschlüsselung die Funktionen zum Verschlüsseln und Entschlüsseln der Daten verwenden: Advanced Encryption Standard (AES) oder RC4.

Die Verschlüsselung mit einem privaten Schlüssel ist sicherer als die Verschlüsselung mit einem öffentlichen Schlüssel, da alle Verschlüsselungsschemas, die mit einem öffentlichen Schlüssel arbeiten, anfällig für Brute-Force-Attacken mithilfe von Schlüsselsuchen sind. Die Verschlüsselung mit privatem Schlüssel ist jedoch von der Geheimhaltung dieses Schlüssels abhängig. Ändern Sie daher den privaten Schlüssel regelmäßig und unternehmen Sie bestimmte Schritte, um sicherzustellen, dass der Schlüssel im Gebrauch, im Speicher oder in der Verteilung nicht erkannt werden kann. Für Sicherheitsempfehlungen, die spezifisch für das Netezza Performance Server sind, siehe die Beschreibung des Arguments " key weiter unten im Thema.

Die Funktionen encrypt() und decrypt() führen die Verschlüsselung und Entschlüsselung auf Feldebene aus, es handelt sich nicht um eine Datenbankverschlüsselung und -entschlüsselung.

Wichtig: Wenn Sie die Funktion ' encrypt() zur Verarbeitung von nvarchar-Eingabewerten verwenden, sollten Sie Ihre Anwendungen und Abfrageprozesse auf die Funktionen ' encrypt_nvarchar() und ' decrypt_nvarchar() umstellen. Die Funktion encrypt() bleibt für die Kompatibilität mit früheren Versionen und Ergebnissen bestehen, bei Tabellen und Ansichten jedoch, die Werte der Funktion encrypt('NVARCHAR') speichern, können Probleme bei Ladeoperationen und GENERATE STATISTICS-Operationen auftreten.

Syntax

Die Funktion encrypt() hat folgende Syntax:
varchar = encrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = encrypt(nvarchar text, nvarchar key [, int algorithm 
          [, varchar IV]]);
Die Funktion decrypt() hat folgende Syntax:
varchar = decrypt(varchar text, varchar key [, int algorithm 
          [, varchar IV]]);
nvarchar = decrypt(nvarchar text, nvarchar key [, int algorithm
          [, varchar IV]]);

Der Wert " text gibt den zu verschlüsselnden oder zu entschlüsselnden Wert an.

Der Wert " key gibt den Schlüssel an, mit dem der Wert ver- oder entschlüsselt werden soll. Stellen Sie sicher, dass der Schlüssel geschützt ist, andernfalls ist die Sicherheit beeinträchtigt. Berücksichtigen Sie beim Entwurf Ihres Sicherheitssystems die Architektur des Netezza Performance Server:
  • SQL-Funktionen werden in der Datei " pg.log auf dem Netezza Performance Server protokolliert, so dass die Ausführung einer " encrypt(secret_column, 'my_secret_key') -Funktion jedem, der die " pg.log -Datei lesen kann, Ihren Schlüssel offenbart.
  • ODBC/JDBC-Dialoge sind mit einer beliebigen Anzahl von Diagnose- oder Hacker-Tools einfach zu erfassen. Wenn Sie Ihren Schlüssel als Bestandteil des SQL übergeben, kann der Schlüssel während dieses Prozesses beeinträchtigt werden.
Speichern Sie den geheimen Schlüssel aus diesen Gründen in einer Tabelle und übergeben Sie den Schlüssel über einen Tabellenjoin an die Funktionen encrypt() und decrypt(). Beispiel:
SELECT decrypt(a.value, b.key) FROM my_table a, my_keys b WHERE 
b.key_id = 1;
Der Wert von " algorithm kann entweder RC4 oder eine der AES-Versionen sein, wie in der folgenden Liste aufgeführt:
0
RC4. Dies ist die Standardeinstellung.
1
AES 128.
2.
AES 192.
3
AES 256.

Zwar ist RC4 der am häufigsten verwendete Verschlüsselungsalgorithmus (er wird beispielsweise von SSL und WEP verwendet), er ist jedoch kryptografisch nicht sicher und anfällig für Attacken.

Advanced Encryption Standard (AES) ist der von der Regierung der Vereinigten Staaten übernommene Verschlüsselungsstandard, der für alle geheimzuhaltenden (klassifizierten) Informationen erforderlich ist. Die drei AES-Versionen unterscheiden sich nur durch die Konstruktion und den Umfang der Schlüssellängen. Obwohl alle drei Schlüssellängen für den Schutz geheimzuhaltender Informationen bis zur Stufe SECRET ausreichend sind, ist für Informationen der Stufe TOP SECRET die Verwendung der Schlüssellängen 192 oder 256 erforderlich.

Der Wert IV gibt den Initialisierungsvektor (IV) an, der für die Verschlüsselung oder Entschlüsselung des Werts verwendet wird. Sie können den Wert IV nur bei Verwendung des Algorithmus AES angeben. (Der Algorithmus RC4 verwendet den Wert IV nicht). Wenn Sie den Wert IV nicht angeben, verwenden die Funktionen encrypt() und decrypt() für IV einen konstanten Wert.

Für die Verschlüsselung mit dem Output-Feedback-Modus (OFB) müssen der Wert IV und der Schlüssel eine Länge von 128 Bit haben. Geben Sie als bewährtes Verfahren für den Schlüssel und den Wert IV (falls verwendet) Werte mit 128 Bit an, damit das System Ihre Eingabewerte verwendet. Wenn ein Wert kleiner oder größer als 128 Bit ist, verwendet das System einen Erweiterungs- oder Ableitungsmechanismus, um den Wert wie folgt anzupassen:

  • Bei Schlüsseln oder IV-Werten, die kleiner als 128 Bit sind, dupliziert das System den Wert, bis der Schlüssel oder der Wert IV die ordnungsgemäße Länge erreicht.
  • Bei Schlüsseln oder IV-Werten, die größer als 128 Bit sind, erstellt das System einen Wert mit 128 Bit, indem ein logisches OR (XOR) der ersten 128 Bit des Werts mit den verbleibenden Bit des Werts verwendet wird.
Wenn Sie eine encrypt()-Funktion in eine andere encrypt()-Funktion einbetten oder in einer solchen Funktion aufrufen, ist das Ergebnis wie im folgenden Beispiel gezeigt eine Zeichenfolge in Klartext:
select encrypt(encrypt('abcde', 'k1', 1), 'k1', 1);
  encrypt
 ---------
  abcde
 (1 row)

Rückgabe

Die Funktionen geben einen verschlüsselten oder einen entschlüsselten Wert zurück. Das SQL Extensions-Toolkit verwendet den OFB-Modus von AES für die Verschlüsselung und Entschlüsselung, wodurch aus der Blockchiffrierung die synchrone Datenstromchiffrierung wird. Bei der Datenstromchiffrierung gibt es keine Auffüllungsanforderung für OFB und die Länge der Ausgabe des verschlüsselten Texts ist dieselbe wie die Länge der als Klartext vorgenommenen Eingabe.

Beispiel

select encrypt('123456',100,0);
 ENCRYPT
---------
 ÉôC¥Ñ
(1 row)

 select encrypt('Netezza Systems','NPS001534',1,'MY_IV is IBM001');
     ENCRYPT
-----------------
 �Ná•▒7Þ¢bhñæ
(1 row)

Generierung von Schlüssel und IV

Sie können die Funktionen hash() und rawtohex() zum Generieren von Schlüsseln und IV-Werten verwenden. Die Funktion hash() gibt je nach dem für die Funktion eingegebenen Algorithmus einen Hashwert der Eingabedaten mit 128 Bit, 160 Bit oder 256 Bit zurück. Das folgende Beispiel zeigt, wie ein 256-Bit-Schlüssel für die AES-Verschlüsselung erstellt wird. Im Beispiel ist die Ausgabe von MYKEY unter Verwendung von Auslassungspunkten (...) absichtlich abgeschnitten, damit die Ausgabe innerhalb der Seitenbegrenzung angezeigt werden kann.

create table impData (cname varchar(35),cid varchar(20));
CREATE TABLE

insert into impData values('Netezza Systems','CNZ0001SYS');
INSERT 0 1

create table securedImpData as select cid, rawtohex(hash(cid,2))
 as mykey, encrypt(cname, rawtohex(hash(cid,2)),2) as ENCRYPTED_CNAME from impData;
INSERT 0 1

select * from securedImpData;
    CID     |                    MYKEY                        | ENCRYPTED_CNAME
------------+-------------------------------------------------+-----------------
 CNZ0001SYS | 8D812C9E8DB362FCB20E...6A00B564175B92762B1A3520 | Ã4W§
      wÂÃð
ŸÃ
(1 row)

create table decryptedData as select CID, decrypt(ENCRYPTED_CNAME,
MYKEY,2) as DECRYPTED_CNAME from securedImpData;
INSERT 0 1

select * from decryptedData;
    CID     | DECRYPTED_CNAME
------------+-----------------
 CNZ0001SYS | Netezza Systems
(1 row)