Beispiele für die korrekte Verwendung von AES_ENCRYPT() und AES_DECRYPT() zum Verschlüsseln und Entschlüsseln von MySQL

Beispiele für die korrekte Verwendung von AES_ENCRYPT() und AES_DECRYPT() zum Verschlüsseln und Entschlüsseln von MySQL

Vorwort

Kürzlich stieß ich bei der Arbeit auf eine Anforderung: Ich musste AES_ENCRYPT() verwenden, um Klartext zu verschlüsseln und in MySQL zu speichern, aber ich stieß auf einige Probleme ... Ich möchte sie im Folgenden im Detail vorstellen.

Es wird gesagt, dass der verschlüsselte Geheimtext entschlüsselt wird und das Ergebnis NULL ist.

Ich habe mir die Tabellenstruktur angesehen, die sie mir geschickt hat:

Dann sah ich, dass sie einen String mit der Funktion AES_DECRYPT() verschlüsselte und anschließend einfügte. Nach erfolgreicher Ausführung warning:
Query OK, 1 row affected, 1 warning (0.00 sec)

(Kein Fehler, aber eine Warnung, wahrscheinlich wegen SQL-Modus)

Zu diesem Zeitpunkt ignorierte sie die Warnung und stellte nach der Entschlüsselung mittels AES_DECRYPT() fest, dass der erhaltene Klartext NULL war.

Wenn wir uns die Tabellenstruktur noch einmal ansehen, sehen wir, dass das Feldattribut „varchar“ und der Zeichensatz ut8 ist. Außerdem lautet die Warnung wie folgt:

mysql> Warnungen anzeigen;
+---------+------+-------------------------------------------------------------------------+
| Ebene | Code | Nachricht |
+---------+------+-------------------------------------------------------------------------+
| Warnung | 1366 | Falscher String-Wert: '\xE3f767\x12...' für Spalte 'passwd' in Zeile 1 |
+---------+------+-------------------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

Sehen Sie sich die Dokumentation an und erfahren Sie, wie diese beiden Funktionen verwendet werden:

-- Verschlüsseln Sie „Hallo Welt“ mit dem Schlüssel „key“ und speichern Sie die verschlüsselte Zeichenfolge in @passmysql> SET @pass=AES_ENCRYPT(„Hallo Welt“, „key“); 
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

-- Überprüfen Sie die Länge der verschlüsselten Zeichenfolge (alle sind Potenzen von 2)
mysql> SELECT CHAR_LENGTH(@pass);
+--------------------+
| CHAR_LENGTH(@Passwort) |
+--------------------+
| 16 |
+--------------------+
1 Zeile im Satz (0,00 Sek.)

-- Entschlüsseln mit AES_DECRYPT()mysql> SELECT AES_DECRYPT(@pass, 'key');
+-----------------------------+
| AES_DECRYPT(@pass, 'Schlüssel') |
+-----------------------------+
| hallo Welt |
+-----------------------------+
1 Zeile im Satz (0,00 Sek.)

Wie können wir es also retten?

Methode 1:

Legen Sie die Feldeigenschaften auf die Typen varbinary/binary/four blob und andere binäre Feldeigenschaften fest.

Erstellen Sie drei Felder mit den Attributen „varbinary“, „binary“ und „blob“.

Und verschlüsseln Sie ‚plaintext1‘, ‚text2‘, ‚plaintext_text3‘ mit dem Schlüssel key und speichern Sie diese in der Tabelle.

Zum Schluss rausnehmen.

mysql> TABELLE ERSTELLEN t_passwd (pass1 varbinary(16), pass2 binary(16), pass3 blob);
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> INSERT INTO t_passwd VALUES (AES_ENCRYPT('Klartext1', 'Schlüssel'), AES_ENCRYPT('Text2', 'Schlüssel'), AES_ENCRYPT('Klartext_Text3', 'Schlüssel')); 
Abfrage OK, 1 Zeile betroffen (0,01 Sek.)

mysql> SELECT AES_DECRYPT(pass1, 'Schlüssel'), AES_DECRYPT(pass2, 'Schlüssel'), AES_DECRYPT(pass3, 'Schlüssel') FROM t_passwd;
+-----------------------------+------------------------------+---------------------------+
| AES_DECRYPT(Passwort1, „Schlüssel“) | AES_DECRYPT(Passwort2, „Schlüssel“) | AES_DECRYPT(Passwort3, „Schlüssel“) |
+-----------------------------+------------------------------+---------------------------+
| Klartext1 | Text2 | Klartext_Text3 |
+-----------------------------+------------------------------+---------------------------+
1 Zeile im Satz (0,00 Sek.)

Die Länge der Attributklammern hängt natürlich von der Länge des Klartextes ab. Hier ist der Klartext kürzer, deshalb sind nur 16 angegeben.

Methode 2:

Konvertieren Sie den Geheimtext in Hexadezimalzahlen und speichern Sie ihn in einer VARCHAR/CHAR-Spalte.

Hier müssen Sie HEX() zum Einzahlen und UNHEX() zum Abheben verwenden.

Erstellen Sie ein Feld mit einem Zeichenfolgenattribut.

Verschlüsseln Sie zunächst „Hallo Welt“ mit dem Schlüssel „key2“ mithilfe von AES und konvertieren Sie die verschlüsselte Zeichenfolge dann mithilfe der HEX-Funktion in eine Hexadezimalzahl.

Abschließend wird der verschlüsselte String mittels UNHEX herausgelöst und anschließend mittels AES mit dem Schlüssel „key2“ entschlüsselt:

mysql> TABELLE ERSTELLEN t_passwd_2(pass1 char(32));
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

mysql> INSERT INTO t_passwd_2 VALUES (HEX(AES_ENCRYPT('Hallo Welt', 'key2')));
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

mysql> WÄHLEN SIE AES_DECRYPT(UNHEX(pass1), 'key2') FROM t_passwd_2; 
+-----------------------------------+
| AES_DECRYPT(UNHEX(Passwort1), 'Schlüssel2') |
+-----------------------------------+
| hallo Welt |
+-----------------------------------+
1 Zeile im Satz (0,00 Sek.)

In ähnlicher Weise ändert sich je nach Länge des Klartexts auch die Länge der mit AES_ENCRYPT verschlüsselten Zeichenfolge, sodass sich auch die Länge der Zeichenfolge nach HEX ändert.
Bei der tatsächlichen Verwendung müssen Sie nur einen angemessenen Wert basierend auf dem Geschäft ermitteln.

Methode 3:

Direkt in varchar speichern, ohne Hexadezimalisierung.

Um zum Anfang des Problems zurückzukehren: Es ist nicht möglich, die verschlüsselte Zeichenfolge im UTF-8-Zeichensatz zu speichern und das Attribut ist varchar.

Ändern Sie einfach den Zeichensatz auf Latin1:

Beim Einfügen wird keine Warnung ausgegeben.

mysql> TABELLE ERSTELLEN t_passwd_3(pass varchar(32)) CHARSET latin1;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> INSERT INTO t_passwd_3 SELECT AES_ENCRYPT('Text', 'Schlüssel3');
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0

mysql> SELECT AES_DECRYPT(Passwort, 'Schlüssel3') FROM t_passwd_3;
+-----------------------------+
| AES_DECRYPT(Passwort, „Schlüssel3“) |
+-----------------------------+
| Text |
+-----------------------------+
1 Zeile im Satz (0,00 Sek.)

Obwohl diese Methode schön ist, kann sie versteckte Gefahren mit sich bringen, solange Sie den Feldzeichensatz auf latin1 setzen:

Im Dokument heißt es:

Viele Verschlüsselungs- und Komprimierungsfunktionen geben Zeichenfolgen zurück, deren Ergebnis beliebige Bytewerte enthalten kann. Wenn Sie diese Ergebnisse speichern möchten, verwenden Sie eine Spalte mit einem binären Zeichenfolgendatentyp VARBINARY oder BLOB. Dadurch werden potenzielle Probleme mit der Entfernung nachstehender Leerzeichen oder der Zeichensatzkonvertierung vermieden, die Datenwerte ändern würden, wie sie beispielsweise bei Verwendung eines nicht binären Zeichenfolgendatentyps (CHAR, VARCHAR, TEXT) auftreten können.

Die allgemeine Idee ist, dass, wenn Sie Methode ③ verwenden, um die verschlüsselte Zeichenfolge direkt im Typ char/varchar/text zu speichern, dies potenzielle Auswirkungen bei der Zeichenkonvertierung oder beim Löschen von Leerzeichen haben kann.

Wenn es also im Char-/Varchar-/Text-Format gespeichert werden muss, beziehen Sie sich auf Methode ② und konvertieren Sie es in Hexadezimalzahlen.

Oder speichern Sie es wie bei Methode ① direkt im Binärfeld.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels Ihnen bei Ihrem Studium oder Ihrer Arbeit helfen kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Referenzdokumente:

Kapitel 12 Funktionen und Operatoren - 12.13 Verschlüsselungs- und Komprimierungsfunktionen

Das könnte Sie auch interessieren:
  • Der MySQL-Server läuft mit der Option --read-only und kann diese Anweisung daher nicht ausführen.
  • mysql-Datenbankmysql: [FEHLER] unbekannte Option ''--skip-grant-tables''
  • Detaillierte Erklärung zur Sicherstellung der Konsistenz von MySQL-Ansichten (mit Prüfoption)
  • Lösung für die Fehlermeldung "java.sql.SQLException: Incorrect string value:'\xF0\x9F\x92\xA9\x0D\x0A...'" beim Speichern von Emoticons in MySQL
  • NULL und leere Zeichenfolge in MySQL
  • Ein Beispiel für die Verbindung von MySQL mit PHP über ODBC zu einer beliebigen Datenbank
  • Detaillierte Erklärung zur Installation und vollständigen Deinstallation von MySQL mit apt-get unter Ubuntu
  • Der MySQL-Server wird mit der Option --skip-grant-tables ausgeführt.
  • Detaillierte Erklärung zur Verwendung von pt-heartbeat zur Überwachung der MySQL-Replikationsverzögerung
  • Einführung in die Verwendung des MySQL pt-slave-restart-Tools

<<:  Detaillierte Erläuterung der Routing-Konfiguration im Linux-System mit mehreren Netzwerkkarten

>>:  Verschaffen Sie sich ein umfassendes Verständnis des Prototypobjekts in JavaScript

Artikel empfehlen

Detaillierte Erklärung verschiedener Bildformate wie JPG, GIF und PNG

Jeder weiß, dass Bilder auf Webseiten im Allgemein...

Facebooks nahezu perfekte Neugestaltung aller Internetdienste

<br />Originalquelle: http://www.a-xuan.cn/?...

js-Entwicklungs-Plugin zum Erzielen eines Tab-Effekts

In diesem Artikelbeispiel wird der spezifische Co...

Reflexion und Proxy in Front-End-JavaScript

Inhaltsverzeichnis 1. Was ist Reflexion? 2. Refle...

Methode zur Erstellung von Vue-Scaffolding-Lernprojekten

1. Was ist Scaffolding? 1. Vue-CLI Vue CLI ist ei...

XHTML-Tutorial: Der Unterschied zwischen Transitional und Strict

Tatsächlich ist XHTML 1.0 in zwei Typen unterteil...

Zusammenfassung der neuen Verwendung von vi (vim) unter Linux

Ich benutze den vi-Editor seit mehreren Jahren, h...

So erstellen Sie eine Deep-Learning-Umgebung mit Python in einem Docker-Container

Überprüfen Sie die Virtualisierung im Task-Manage...

Detaillierte Erklärung zum Schreiben mehrerer Bedingungen von CSS: nicht

Der Pseudoklassenselektor :not kann Elemente filt...

Wie gestaltet man eine Webseite? Wie erstelle ich eine Webseite?

Wenn es um das Verständnis von Webdesign geht, sc...

Reines CSS zum Ändern der Farbe des Bildes

Die CSS-Technik zum Ändern der Farbe eines Bildes...

Beispiel für die Implementierung des TikTok-Textschütteleffekts mit CSS

In der täglichen Entwicklung streiten sich Front-...