- Kategorien:
ENCRYPT¶
Verschlüsselt einen VARCHAR- oder BINARY-Wert mithilfe einer VARCHAR-Passphrase.
- Siehe auch:
ENCRYPT_RAW, DECRYPT, DECRYPT_RAW, TRY_DECRYPT, TRY_DECRYPT_RAW
Syntax¶
ENCRYPT( <value_to_encrypt> , <passphrase> ,
[ [ <additional_authenticated_data> , ] <encryption_method> ]
)
Argumente¶
Erforderlich:
value_to_encrypt
Der VARCHAR- oder BINARY-Wert, der verschlüsselt werden soll.
passphrase
Die Passphrase zum Ver-/Entschlüsseln der Daten. Die Passphrase ist immer ein VARCHAR-Wert, unabhängig davon, ob
value_to_encrypt
ein VARCHAR-Wert oder ein BINARY-Wert ist.
Optional:
additional_authenticated_data
Zusätzliche authentifizierte Daten (AAD) sind zusätzliche Daten, deren Vertraulichkeit und Authentizität während des Entschlüsselungsprozesses sichergestellt sind. Diese AAD sind jedoch nicht verschlüsselt und nicht als ein Feld im Rückgabewert der Funktionen ENCRYPT und ENCRYPT_RAW enthalten.
Wenn AAD an die Verschlüsselungsfunktion (ENCRYPT oder ENCRYPT_RAW) übergeben werden, müssen dieselben AAD an die Entschlüsselungsfunktion (DECRYPT oder DECRYPT_RAW) übergeben werden. Wenn die an die Entschlüsselungsfunktion übergebenen AAD nicht mit den an die Verschlüsselungsfunktion übergebenen AAD übereinstimmen, schlägt die Entschlüsselung fehl.
Der Unterschied zwischen den AAD und dem Wert von
passphrase
besteht darin, dass die Passphrase geheim gehalten werden soll (andernfalls ist die Verschlüsselung im Wesentlichen wertlos), während die AAD öffentlich gelassen werden können. Mithilfe der AAD wird authentifiziert, dass eine öffentliche Information und ein verschlüsselter Wert miteinander verknüpft sind. Der Beispielabschnitt zur ENCRYPT-Funktion enthält ein Beispiel, welches das Verhalten zeigt, wenn die AAD übereinstimmen, und das Verhalten, wenn diese nicht übereinstimmen.Für ENCRYPT_RAW und DECRYPT_RAW sollten die AAD vom Datentyp BINARY sein. Für ENCRYPT und DECRYPT können die AAD entweder vom Datentyp VARCHAR oder BINARY sein und müssen nicht mit dem Datentyp des verschlüsselten Werts übereinstimmen.
Die AAD werden nur von AEAD-aktivierten Verschlüsselungsmodi wie GCM (Standard) unterstützt.
encryption_method
Diese Zeichenfolge gibt die Methode zum Ver-/Entschlüsseln der Daten an. Diese Zeichenfolge enthält Unterfelder:
<algorithm>-<mode> [ /pad: <padding> ]
algorithm
ist derzeit beschränkt auf:'AES'
: Wenn eine Passphrase übergeben wird (z. B. an ENCRYPT), verwendet die Funktion die AES-256-Verschlüsselung (256 Bit). Wenn ein Schlüssel übergeben wird (z. B. an ENCRYPT_RAW), verwendet die Funktion abhängig von der Schlüssellänge eine 128-Bit-, 192-Bit- oder 256-Bit-Verschlüsselung.
Bei
algorithm
muss die Groß-/Kleinschreibung nicht beachtet werden.mode
gibt an, welcher Blockverschlüsselungsmodus zum Verschlüsseln von Meldungen verwendet werden soll. Die folgende Tabelle zeigt, welche Modi unterstützt werden und welche dieser Modi das Auffüllen unterstützen:Modus
Auffüllen
Beschreibung
'ECB'
Ja
Jeder Block wird einzeln mit dem Schlüssel verschlüsselt. Dieser Modus wird im Allgemeinen nicht empfohlen und ist nur aus Gründen der Kompatibilität mit externen Implementierungen enthalten.
'CBC'
Ja
Der verschlüsselte Block ist XORed mit dem vorherigen Block.
'GCM'
Nein
Der Galois/Counter-Modus ist ein Hochleistungs-Verschlüsselungsmodus, der AEAD-aktiviert ist. AEAD sichert zusätzlich die Authentizität und Vertraulichkeit der verschlüsselten Daten durch Generieren eines AEAD-Tags. Zudem unterstützt AEAD die AAD (zusätzliche authentifizierte Daten).
'CTR'
Nein
Counter-Modus.
'OFB'
Nein
Output-Feedback-Modus. Der Verschlüsselungstext ist XORed mit dem Klartext eines Blocks.
'CFB'
Nein
Cipher-Feedback-Modus ist eine Kombination aus OFB und CBC.
Bei
mode
muss die Groß-/Kleinschreibung nicht beachtet werden.padding
gibt an, wie Nachrichten aufgefüllt werden sollen, deren Länge nicht ein Vielfaches der Blockgröße beträgt. Das Auffüllen gilt nur für die Modi ECB und CBC. Für andere Modi wird das Auffüllen ignoriert. Mögliche Werte für das Auffüllen sind:'PKCS'
: Verwendet PKCS5 zum Auffüllen von Blöcken.'NONE'
: Kein Auffüllen. Der Benutzer muss sich um das Auffüllen kümmern, wenn der Modus ECB oder CBC verwendet wird.
Bei
padding
muss die Groß-/Kleinschreibung nicht beachtet werden.Standardeinstellung:
'AES-GCM'
.Wenn
mode
nicht angegeben ist, wird GCM verwendet.Wenn
padding
nicht angegeben ist, wird PKCS verwendet.
Rückgabewerte¶
Der Datentyp des zurückgegebenen Werts ist BINARY.
Obwohl nur ein einziger Wert zurückgegeben wird, enthält dieser Wert zwei oder drei verkettete Felder:
Das erste Feld ist ein Initialisierungsvektor (IV). Der IV wird zufällig unter Verwendung eines CTR-DRBG-Zufallszahlengenerators erzeugt. Der IV wird sowohl bei der Verschlüsselung als auch der Entschlüsselung verwendet.
Das zweite Feld ist der Verschlüsselungstext (verschlüsselter Wert) von
value_to_encrypt
.Wenn der Verschlüsselungsmodus AEAD-aktiviert ist, enthält der zurückgegebene Wert auch ein drittes Feld, das AEAD-Tag.
Die Größe von IV und Tags hängt vom Verschlüsselungsmodus ab.
Nutzungshinweise¶
Verwenden Sie
DECRYPT()
, um mitENCRYPT()
verschlüsselte Daten zu entschlüsseln. Verwenden Sie nichtDECRYPT_RAW()
.Verwenden Sie
DECRYPT_RAW()
, um mitENCRYPT_RAW()
verschlüsselte Daten zu entschlüsseln. Verwenden Sie nichtDECRYPT()
.Die Parameter der Funktion sind aus Sicherheitsgründen maskiert. Vertrauliche Informationen wie die folgenden sind im Abfrageprotokoll und auch für Snowflake nicht sichtbar:
Der zu verschlüsselnde oder zu entschlüsselnde Zeichenfolge- oder Binärwert.
Die Passphrase oder der Schlüssel.
Die Funktionen verwenden eine FIPS-kompatible kryptografische Bibliothek, um die Ver- und Entschlüsselung effektiv durchzuführen.
Die Passphrase oder der Schlüssel zum Entschlüsseln eines Datenelements muss mit der Passphrase oder dem Schlüssel zum Verschlüsseln dieser Daten übereinstimmen.
Die Passphrase kann beliebig lang sein, sogar 0 (die leere Zeichenfolge). Snowflake empfiehlt jedoch dringend, eine Passphrase zu verwenden, die mindestens 8 Byte lang ist.
Snowflake empfiehlt, dass die Passphrase den allgemeinen Best Practices für Kennwörter folgt, z. B. Verwendung einer Mischung aus Groß- und Kleinbuchstaben, Zahlen und Satzzeichen.
Die Passphrase wird nicht direkt zum Ver-/Entschlüsseln der Zeichenfolge verwendet. Stattdessen wird die Passphrase verwendet, um einen Verschlüsselungs-/Entschlüsselungsschlüssel abzuleiten, der für dieselbe Passphrase immer gleich ist. Snowflake verwendet die Schlüsselableitungsfunktion PBKDF2 (siehe https://en.wikipedia.org/wiki/PBKDF2) mit einem Snowflake-internen Startwert, um den Verschlüsselungs-/Entschlüsselungsschlüssel aus der angegebenen Passphrase zu berechnen.
Aufgrund dieser Schlüsselableitung kann die Verschlüsselungs-/Entschlüsselungsfunktion für Folgendes nicht verwendet werden:
Entschlüsseln von Daten, die extern verschlüsselt wurden
Verschlüsseln von Daten, die extern entschlüsselt werden
Verwenden Sie dazu ENCRYPT_RAW oder DECRYPT_RAW.
Da der Initialisierungsvektor immer per Zufallsgenerator neu generiert wird, gibt der Aufruf von
ENCRYPT()
mit demselbenvalue_to_encrypt
-Wert und demselbenpassphrase
-Wert nicht jedes Mal dasselbe Ergebnis zurück. Wenn Sie dieselbe Ausgabe für dieselbenvalue_to_encrypt
- undpassphrase
-Werte generieren müssen, müssen Sie ENCRYPT_RAW verwenden und den Initialisierungsvektor angeben.
Beispiele¶
In diesem Beispiel wird ein VARCHAR mit einer einfachen Passphrase verschlüsselt.
SELECT encrypt('Secret!', 'SamplePassphrase');Die Ausgabe ist Text, der für Menschen nicht leicht zu lesen ist.
Der folgende Code zeigt ein einfaches Beispiel für Ver- und Entschlüsselung:
SET passphrase='poiuqewjlkfsd';SELECT TO_VARCHAR( DECRYPT( ENCRYPT('Patient tested positive for COVID-19', $passphrase), $passphrase), 'utf-8') AS dcrypt ; +--------------------------------------+ | DCRYPT | |--------------------------------------| | Patient tested positive for COVID-19 | +--------------------------------------+
In diesem Beispiel wird ein BINARY-Wert für value_to_encrypt
und für die authentifizierten Daten verwendet.
SELECT encrypt(to_binary(hex_encode('Secret!')), 'SamplePassphrase', to_binary(hex_encode('Authenticated Data')));Die Ausgabe lautet:
6E1361E297C22969345F978A45205E3E98EB872844E3A0F151713894C273FAEF50C365S
In diesem Beispiel wird die Verwendung eines alternativen Modus (CBC
) als Teil des Bezeichners für die Verschlüsselungsmethode gezeigt. Diese Verschlüsselungsmethode gibt auch eine Auffüllregel (PKCS
) an. In diesem Beispiel ist der AAD-Parameter NULL.
SELECT encrypt(to_binary(hex_encode('secret!')), 'sample_passphrase', NULL, 'aes-cbc/pad:pkcs') as encrypted_data;
In diesem Beispiel wird die Verwendung der AAD-Funktion veranschaulicht:
SELECT
TO_VARCHAR(
DECRYPT(
ENCRYPT('penicillin', $passphrase, 'John Dough AAD', 'aes-gcm'),
$passphrase, 'John Dough AAD', 'aes-gcm'),
'utf-8')
AS medicine
;
+------------+
| MEDICINE |
|------------|
| penicillin |
+------------+
Wenn Sie die falschen AAD übergeben, schlägt die Entschlüsselung fehl:
SELECT
DECRYPT(
ENCRYPT('penicillin', $passphrase, 'John Dough AAD', 'aes-gcm'),
$passphrase, 'wrong patient AAD', 'aes-gcm') AS medicine
;
100311 (22023): Decryption failed. Check encrypted data, key, AAD, or AEAD tag.