Wie stelle ich die Select-Abfrage bei einem speziellen Datenfeld?

Hallo,
ich habe hier mal eine simple Abfrage, die 30 Datenfelder pro Datensatz hat und wenn die Gruppe = „1“ ist, werden diese auch ausgegeben.

SELECT * FROM inventory, inventory_content WHERE inventory.group_id = 1

Soweit so gut, allerdings möchte ich das im Ergebnis ein Feld (inventroy.key) mit dem Befehl aes_decrypt behandelt wird und das Feld entschlüsselt wird.
Wie muss hier die Syntax aussehen, kann man das in einer Abfrage kombinieren?

Es funktioniert wenn ich bei Select anstelle des „*“ alle Spalten eintrage und dann dort das AES_Decrypt vor die Spalte schreibe, aber bei 30 Spalten ist das eher unpraktikabel :wink:
Ich suche eine bessere Lösung…

Danke, Thomas

Es wird keine geben - außer du erstellst dir eine (Materialized) View, in der du aber dann genau dasselbe machen musst, nämlich das aes_decrypt auf das Feld „key“.
Dafür kannst du dann aus dieser (M-)View ohne weitere Befehle auslesen …

Hängt auch davon ab, was danach mit dem Abfrageergebnis passiert.
Falls es nicht stört, wenn es 31 statt 30 Felder sind, kannst du den Key zweimal holen:

SELECT *
     , AES_DECRYPT(inventory.key, {key_string}) AS Decrypted_Key 
WHERE  inventory.group_id = 1
2 Like

Echt, das ist ja umständlich… dann lasse ich das Decrypt vorher laufen und schreibe die Werte zurück. Danke!!!

Das ist die Lösung :slight_smile: wie einfach!!! Danke!

Wenn man den Wald vor lauter Bäumen schon nimmer sieht … auf die allereinfachste Lösung komm ich wieder mal nicht …

Hi!
Wobei ein * eigentlich keine gute Praxis ist.
Zum spielen ist das ganz gut, später eher nur dann, wenn der Client auch noch nicht weiß, was da für Spalten kommen, und darauf korrekt reagieren wird.

Ansonsten ist immer ratsam, alle Spalten konkret aufzulisten. Denn wenn sich an der Tabelle was ändert, bekommst du falsche Spalten zurück, oder es fehlen benötigte.
Ein vernünftiger Editor kann dir auch ein Standard-Select generieren, das du nur noch anpassen musst. Der wirklich geringe Aufwand überwiegt den späteren Ärger bei weitem.

Ich möchte davon abraten, das so zu machen. Also nicht die SELECT-Anweisung, das meine ich nicht. Sondern die Verschlüsselung auf diese Weise. MySQL (und davon gehe ich mal aus) macht standardmäßig ECB mit 128 Bit. ECB hat das Problem, dass gleiche Klartexte auch immer gleiche Chiffretexte ergeben. Zudem sind Blöcke nur 128 Bit lang, das bedeutet, dass man am Chiffretext Passagen mit Wiederholungen erkennen kann. Das ist ein vermeidbares Sicherheitsproblem.

Sehr schön zu sehen ist das beim Beispiel von Tux hier:

Mach das nicht. Wer AES sagt, muss auch mindestens CBC sagen. Aber dafür braucht es einen zufälligen (!) Initialisierungvektor.

https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt