Die in diesem Abschnitt beschriebenen Funktionen führen Ver- und Entschlüsselung sowie Komprimierung und Dekomprimierung durch.
Hinweis: Die Verschlüsselungs-
und Komprimierungsfunktionen geben Binär-Strings zurück. Bei
vielen dieser Funktionen kann das Ergebnis willkürliche
Bytewerte enthalten. Wenn Sie diese Ergebnisse speichern wollen,
verwenden Sie eine BLOB
-Spalte statt einer
CHAR
- oder VARCHAR
-Spalte,
um potenzielle Probleme zu vermeiden, die aufgrund einer
Datenwertänderung durch das Entfernen von Leerzeichen am Ende
entstehen könnten.
Hinweis: Für die MD5- und SHA-1-Algorithmen sind Exploits bekannt. Sie sollten deswegen die Verwendung einer anderen Verschlüsselungsfunktion in Betracht ziehen, die in diesem Abschnitt beschrieben sind.
AES_ENCRYPT(
,
str
,key_str
)AES_DECRYPT(
crypt_str
,key_str
)
Diese Funktionen gestatten die Ver- und Entschlüsselung von Daten mithilfe des offiziellen AES-Algorithmus (Advanced Encryption Standard; dieser war früher als „Rijndael“ bekannt). Die Verschlüsselung erfolgt mit einem 128-Bit-Schlüssel, den Sie aber durch Modifizierung des Quellcodes auf 256 Bits erweitern können. Wir haben uns für eine Schlüsselbreite von 128 Bits entschieden, da diese bei hoher Verarbeitungsgeschwindigkeit für die meisten Zwecke ausreichend sicher ist.
AES_ENCRYPT()
verschlüsselt einen String
und gibt einen Binär-String zurück.
AES_DESCRIPT()
entschlüsselt den
verschlüsselten String und gibt den Original-String
zurück. Die Eingabeargumente dürfen eine beliebige Länge
haben. Wenn eines der Argumente NULL
ist,
ist das Ergebnis dieser Funktion ebenfalls
NULL
.
Da AES als Algorithmus auf Blockebene arbeitet, werden Strings unterschiedlicher Länge bei der Verschlüsselung mit Füllzeichen erweitert. Die Länge des Ergebnis-Strings lässt sich mit folgender Formel berechnen:
16 × (trunc(string_length
/ 16) + 1)
Wenn AES_DECRYPT()
ungültige Daten oder
ein inkorrektes Auffüllen erkennt, gibt es
NULL
zurück. Es ist allerdings möglich,
dass AES_DECRYPT()
einen
Nicht-NULL
-Wert zurückgibt, wenn
Eingabedaten oder Schlüssel ungültig sind. (Der
Rückgabewert ist dann in aller Regel unsinnig).
Sie können die AES-Funktionen zur Speicherung von Daten in verschlüsselter Form verwenden, indem Sie Ihre Abfragen abändern:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
AES_ENCRYPT()
und
AES_DECRYPT()
können als die aus
kryptografischer Sicht sichersten
Verschlüsselungsfunktionen gelten, die derzeit in MySQL zur
Verfügung stehen.
Komprimiert einen String und gibt das Ergebnis als
Binär-String zurück. Diese Funktion erfordert es, dass
MySQL mit einer Komprimierungsbibliothek wie etwa
zlib
kompiliert wurde. Andernfalls ist
der Rückgabewert immer NULL
. Der
komprimierte String kann mit UNCOMPRESS()
wieder dekomprimiert werden.
mysql>SELECT LENGTH(COMPRESS(REPEAT('a',1000)));
-> 21 mysql>SELECT LENGTH(COMPRESS(''));
-> 0 mysql>SELECT LENGTH(COMPRESS('a'));
-> 13 mysql>SELECT LENGTH(COMPRESS(REPEAT('a',16)));
-> 15
Der Inhalt des komprimierten Strings wird wie folgt gespeichert:
Leere Strings werden als Leer-Strings gespeichert.
Nichtleere Strings werden als unkomprimierte Strings mit
einer Länge von 4 Byte gespeichert (wobei das
niedrigste Byte zuerst kommt), gefolgt vom komprimierten
String. Wenn der String mit einem Leerzeichen endet,
wird ein zusätzliches Zeichen
‘.
’ hinzugefügt, um
Probleme mit dem Abschneiden von Leerzeichen am Ende
für den Fall zu vermeiden, dass das Ergebnis in einer
CHAR
- oder
VARCHAR
-Spalte gespeichert wird. (Von
der Verwendung von CHAR
oder
VARCHAR
zur Speicherung komprimierter
Strings wird abgeraten. Verwenden Sie stattdessen besser
eine BLOB
-Spalte.)
Entschlüsselt den verschlüsselten String
crypt_str
mit
pass_str
als Passwort.
crypt_str
sollte ein String sein,
der von ENCODE()
zurückgegeben wurde.
Verschlüsselt str
unter
Verwendung von pass_str
als
Passwort. Zur Entschlüsselung des Ergebnisses verwenden Sie
DECODE()
.
Das Ergebnis ist ein Binär-String derselben Länge wie
str
.
DES_DECRYPT(
crypt_str
[,key_str
])
Entschlüsselt einen String, der mit
DES_ENCRYPT()
verschlüsselt wurde. Wenn
ein Fehler auftritt, gibt die Funktion
NULL
zurück.
Beachten Sie, dass diese Funktion nur funktioniert, wenn MySQL mit SSL-Unterstützung konfiguriert wurde. Siehe auch Abschnitt 5.9.7, „Verwendung sicherer Verbindungen“.
Wird kein Argument key_str
angegeben, dann untersucht DES_DECRYPT()
das erste Byte des verschlüsselten Strings, um die
DES-Schlüsselnummer zu ermitteln, die zur Verschlüsselung
des ursprünglichen Strings verwendet wurde, und liest den
Schlüssel dann aus der DES-Schlüsseldatei aus, um die
Nachricht zu entschlüsseln. Damit dies klappt, benötigt
der Benutzer die Berechtigung SUPER
. Die
Schlüsseldatei kann mit der Serveroption
--des-key-file
angegeben werden.
Wenn Sie der Funktion ein Argument
key_str
übergeben, wird dieser
String als Schlüssel zur Entschlüsselung der Nachricht
verwendet.
Wenn das Argument crypt_str
kein
verschlüsselter String zu sein scheint, gibt MySQL den
übergebenen String crypt_str
zurück.
DES_ENCRYPT(
str
[,(key_num
|key_str
)])
Verschlüsselt den String mit dem angegebenen Schlüssel unter Verwendung des Triple-DES-Algorithmus.
Beachten Sie, dass diese Funktion nur funktioniert, wenn MySQL mit SSL-Unterstützung konfiguriert wurde. Siehe auch Abschnitt 5.9.7, „Verwendung sicherer Verbindungen“.
Der für die Verschlüsselung zu verwendende Schlüssel wird
basierend auf dem zweiten Argument zu
DES_ENCRYPT()
(sofern vorhanden)
ausgewählt:
Argument | Beschreibung |
Kein Argument | Der erste Schlüssel aus der DES-Schlüsseldatei wird verwendet. |
key_num |
Der angegebene Schlüssel (0 bis 9) aus der DES-Schlüsseldatei wird verwendet. |
key_str |
Der angegebene String wird zur Verschlüsselung von
str benutzt. |
Die Schlüsseldatei kann mit der Serveroption
--des-key-file
angegeben werden.
Der Rückgabe-String ist ein Binär-String, bei dem das
erste Zeichen CHAR(128 | key_num)
ist.
Wenn ein Fehler auftritt, gibt
DES_ENCRYPT()
NULL
zurück.
Die 128 wird hinzugefügt, um die Erkennung eines
verschlüsselten Schlüssels zu erleichtern. Wenn Sie einen
String-Schlüssel verwenden, ist
key_num
127.
Die String-Länge des Ergebnisses wird mit dieser Formel angegeben:
new_len
=orig_len
+ (8 - (orig_len
% 8)) + 1
Jede Zeile in der DES-Schlüsseldatei hat das folgende Format:
key_num
des_key_str
Jeder key_num
-Wert muss eine Zahl
zwischen 0
und 9
sein.
Die Zeilen können in der Datei beliebig sortiert sein.
des_key_str
ist der String, der
zur Verschlüsselung der Nachricht verwendet wird. Es sollte
mindestens ein Leerzeichen zwischen der Zahl und dem
Schlüssel stehen. Der erste Schlüssel ist der
Standardschlüssel: Er wird benutzt, wenn kein
Schlüsselargument für DES_ENCRYPT()
angegeben wurde.
Sie können MySQL mit der Anweisung FLUSH
DES_KEY_FILE
anweisen, neue Schlüsselwerte aus
der Schlüsseldatei einzulesen. Dies erfordert die
Berechtigung RELOAD
.
Ein Vorteil der Verwendung eines Satzes mit Standardschlüsseln besteht darin, dass dies Anwendungen eine Möglichkeit bietet, auf das Vorhandensein verschlüsselter Spaltenwerte zu prüfen, ohne dem Endbenutzer das Recht zur Verschlüsselung dieser Werte zu geben.
mysql>SELECT customer_address FROM customer_table
>WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
Verschlüsselt str
unter
Verwendung des Unix-Systemaufrufs crypt()
und gibt einen Binär-String zurück. Das Argument
salt
sollte ein String mit
mindestens zwei Zeichen sein. Wird kein
salt
-Argument angegeben, dann
wird ein zufälliger Wert verwendet.
mysql> SELECT ENCRYPT('hello');
-> 'VxuFAJXVARROc'
ENCRYPT()
ignoriert zumindest auf einigen
Systemen alle bis auf die ersten acht Zeichen von
str
. Dieses Verhalten wird von
der Implementierung des zugrunde liegenden
crypt()
-Systemaufrufs bestimmt.
Wenn crypt()
nicht auf Ihrem System
verfügbar ist (wie es bei Windows der Fall ist), gibt
ENCRYPT()
immer NULL
zurück.
Berechnet eine MD5-Prüfsumme mit 128 Bits für den String.
Der Wert wird als 32 Hexadezimalstellen umfassender
Binär-String zurückgegeben. Ist das Argument
NULL
, so wird auch
NULL
zurückgegeben. Der Rückgabewert
kann z. B. als Hash-Schlüssel verwendet werden.
mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
Dies ist der „MD5-Message-Digest-Algorithmus“ von RSA Data Security, Inc.
Wenn Sie den Wert in Großbuchstaben konvertieren wollen,
lesen Sie die Beschreibung zur Konvertierung von
Binär-Strings im Abschnitt zum Operator
BINARY
(Abschnitt 12.8, „Cast-Funktionen und Operatoren“).
Beachten Sie auch die Anmerkung zum MD5-Algorithmus am Anfang dieses Abschnitts.
OLD_PASSWORD()
wurde zu MySQL
hinzugefügt, als die Implementierung von
PASSWORD()
geändert wurde, um die
Sicherheit zu verbessern. OLD_PASSWORD()
gibt den Wert der alten (d. h. vor Version 4.1 verwendeten)
Implementierung von PASSWORD()
als
Binär-String zurück und soll Ihnen das Zurücksetzen von
Passwörtern auf Clients vor Version 4.1 gestatten, die mit
Ihrem MySQL Server unter Version 5.1 eine
Verbindung herstellen können sollen, ohne ausgesperrt zu
werden. Siehe auch Abschnitt 5.8.9, „Kennwort-Hashing ab MySQL 4.1“.
Berechnet einen Passwort-String aus dem Klartextpasswort
str
und gibt diesen zurück. Der
Rückgabewert ist ein Binär-String oder aber
NULL
, sofern das Argument
NULL
war. Diese Funktion wird zur
Verschlüsselung von MySQL-Passwörtern zur Speicherung in
der Spalte Password
der Grant-Tabelle
user
benutzt.
mysql> SELECT PASSWORD('badpwd');
-> '*AAB3E285149C0135D51A520E1940DD3263DC008C'
Die PASSWORD()
-Verschlüsselung ist
unidirektional (d. h. unumkehrbar).
PASSWORD()
führt keine
Passwortverschlüsselung in der Art der Verschlüsselung von
Unix-Passwörtern durch. Siehe auch
ENCRYPT()
.
Hinweis: Die Funktion
PASSWORD()
wird in MySQL Server vom
Authentifizierungssystem verwendet. Sie sollten Sie
nicht in Ihren eigenen Anwendungen
einsetzen. Ziehen Sie zu diesem Zweck eher
MD5()
oder SHA1()
in
Betracht. Ferner können Sie RFC 2195 weitere Informationen
zum sicheren Umgang mit Passwörtern und Authentifizierung
in Ihren Anwendungen entnehmen.
Berechnet eine 160 Bits umfassende SHA-1-Prüfsumme für den
String. (Siehe auch RFC 3174 mit dem Titel „Secure
Hash Algorithm“). Der Wert wird als 40
Hexadezimalstellen umfassender Binär-String zurückgegeben.
Ist das Argument NULL
, so wird auch
NULL
zurückgegeben. Diese Funktion
lässt sich etwa für die Erstellung eines Hash-Schlüssels
verwenden. Sie können sie auch als Kryptografiefunktion zur
Speicherung von Passwörtern verwenden.
SHA()
ist synonym zu
SHA1()
.
mysql> SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()
kann als aus kryptografischer
Sicht sichereres Äquivalent zu MD5()
betrachtet werden. Allerdings sollten Sie auch die Anmerkung
zu den MD5- und SHA-1-Algorithmen am Anfang dieses
Abschnitts beachten.
UNCOMPRESS(
string_to_uncompress
)
Entkomprimiert einen String, der mit der Funktion
COMPRESS()
komprimiert wurde. Wenn dieses
Argument kein komprimierter Wert ist, ist das Ergebnis
NULL
. Diese Funktion erfordert es, dass
MySQL mit einer Komprimierungsbibliothek wie etwa
zlib
kompiliert wurde. Andernfalls ist
der Rückgabewert immer NULL
.
mysql>SELECT UNCOMPRESS(COMPRESS('any string'));
-> 'any string' mysql>SELECT UNCOMPRESS('any string');
-> NULL
UNCOMPRESSED_LENGTH(
compressed_string
)
Gibt die Länge zurück, die der komprimierte String vor der Länge hatte.
mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
-> 30
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.