Vorwort Kürzlich stieß ich bei der Arbeit auf eine Anforderung: Ich musste 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 (Kein Fehler, aber eine Warnung, wahrscheinlich wegen SQL-Modus) Zu diesem Zeitpunkt ignorierte sie die Warnung und stellte nach der Entschlüsselung mittels 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 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. 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:
|
<<: Detaillierte Erläuterung der Routing-Konfiguration im Linux-System mit mehreren Netzwerkkarten
>>: Verschaffen Sie sich ein umfassendes Verständnis des Prototypobjekts in JavaScript
Jeder weiß, dass Bilder auf Webseiten im Allgemein...
<br />Originalquelle: http://www.a-xuan.cn/?...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis Installieren Sie die Deklarati...
Inhaltsverzeichnis 1. Was ist Reflexion? 2. Refle...
1. Was ist Scaffolding? 1. Vue-CLI Vue CLI ist ei...
Tatsächlich ist XHTML 1.0 in zwei Typen unterteil...
Ich benutze den vi-Editor seit mehreren Jahren, h...
In diesem Artikel wird hauptsächlich die Installa...
Überprüfen Sie die Virtualisierung im Task-Manage...
Der Pseudoklassenselektor :not kann Elemente filt...
Wenn es um das Verständnis von Webdesign geht, sc...
Ich habe heute Nachmittag mit der Konfiguration v...
Die CSS-Technik zum Ändern der Farbe eines Bildes...
In der täglichen Entwicklung streiten sich Front-...