Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySql WorkBench AES 256-Entschlüsselung

An Ihrer ersten Abfrage ist eigentlich nichts auszusetzen, syntaktisch ist sie genau richtig, wie dieses ausgearbeitete Beispiel zeigt.

mysql> SET @@SESSION.block_encryption_mode = 'aes-256-cbc';

mysql> create table MyTable(
    ->  Encrypted_ID varbinary(256),
    ->  InitializationVector_iv varbinary(16)
    -> );
Query OK, 0 rows affected (0.93 sec)

mysql> SET @iv = RANDOM_BYTES(16);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO MyTable SET Encrypted_ID = AES_ENCRYPT('hello','key', @iv), InitializationVector_iv = @iv;
Query OK, 1 row affected (0.17 sec)

mysql> SELECT CAST(AES_DECRYPT(Encrypted_ID,'key', InitializationVector_iv) AS CHAR) from MyTable;
+------------------------------------------------------------------------+
| CAST(AES_DECRYPT(Encrypted_ID,'key', InitializationVector_iv) AS CHAR) |
+------------------------------------------------------------------------+
| hello                                                                  |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)

Warum es nicht funktioniert, habe ich geschafft, die Abfrage dazu zu bringen, NULL in 2 Szenarien zurückzugeben. Erstens erhalten Sie NULL zurückgegeben, wenn Sie ein anderes iv für die Verschlüsselung und Entschlüsselung verwenden. Sie sollten sich also ansehen, wie Sie als iv speichern. Zweitens erhalten Sie NULL, wenn Sie die Variable block_encryption_mode beim Speichern und beim Versuch, den Wert abzurufen, anders eingestellt haben. Überprüfen Sie, ob Sie zwischen den Sitzungen nicht versehentlich auf den Standardwert „aes-128-ebc“ zurückgreifen. Vielleicht gibt es noch andere...

Die zweite Abfrage schlägt fehl, da Sie das iv sowohl für die Verschlüsselungs- als auch für die Entschlüsselungsfunktion bereitstellen müssen, Sie verwenden es nur zum Verschlüsseln. Da Sie außerdem die Werte aus MyTable nehmen, ist Encrypted_ID bereits verschlüsselt und der Effekt dieser Abfrage wäre, sie erneut zu verschlüsseln, bevor Sie dies rückgängig machen, um Sie zum gespeicherten (verschlüsselten) Wert zurückzubringen.

Schließlich wird AES nur 16 verwenden Bytes des iv, also könnten Sie das genauso gut VARBINARY(16) machen.