Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL : verschlüsselte Daten speichern (https://www.delphipraxis.net/149352-mysql-verschluesselte-daten-speichern.html)

rawi 19. Mär 2010 12:04

Datenbank: MySQL • Zugriff über: Internet

MySQL : verschlüsselte Daten speichern
 
Hallo DP'ler,
nachdem mir hier im Forum schon einige Beiträge geholfen haben, möchte ich mich heute mit einem Problem an euch wenden bei dem ich zur Zeit keine Lösung sehe. Vermutlich sehe ich den Wald vor lauter Bäumen nicht.

Doch nun zu meinem Problem:
Ich habe eine MySQL-DB im Web liegen. Nun möchte ich verschlüsselte Daten in dieser DB speichern. Die Daten, mit RC4 verschlüsselt, ergeben ja eine wirre Zeichenfolge. So soll es ja auch sein.
Versuche ich diese Daten nun in die DB zu schreiben bekomme ich ab und zu die Fehlermeldung 'Fehler in der SQL-Syntax...' und er zeigt mir einen Teil dieser wirren Zeichenfolge an. Das entsprechende Feld in der DB ist als Varchar deklariert. Habe es aber auch mit anderen Feldtypen versucht.

Nun habe ich versucht den codierten String in Hex umzuwandeln und dann zu speichern. Jetzt werden die Daten ohne Fehler gespeichert, klar sind ja keine ungewöhnlichen Zeichen mehr drin, aber leider ist ein decodieren nach Umwandlung des Hexstrings auch nicht jedesmal möglich. Diese Vorgehensweise habe ich dann erst mal zu den Akten gelegt.

Zur Zeit fange ich den Fehler ab und sende den Insert-Befehl mit neu codierten Daten erneut ab. Benötige aber manchmal trotzdem mehrere Versuche bis es funktioniert.

Ich hoffe ihr könnt mir mit einem Lösungsansatz helfen. Sollten noch weitere Info's benötigt werden, einfach nur melden.

Schon mal vielen Dank im Voraus.

Gruß rawi

Bernhard Geyer 19. Mär 2010 12:06

Re: MySQL : verschlüsselte Daten speichern
 
Verwendest du parametrisierte Inserts?
Falls nein, stell darauf um!

DeddyH 19. Mär 2010 12:07

Re: MySQL : verschlüsselte Daten speichern
 
Du musst die "wirre Zeichenfolge" escapen. Je nach Sprache ginge das z.B. mit AnsiQuotedStr() oder mysql_real_escape().

rawi 19. Mär 2010 15:29

Re: MySQL : verschlüsselte Daten speichern
 
Erst einmal vielen Dank für die schnellen Antworten.

@Bernhard
ich verwende keine parametrisierten Inserts, der Insert wir in Delphi per Code erstellt. Falls es das ist was du meintest.
Delphi-Quellcode:
strAnsi := 'insert into tblData (rechnername, rechnerno, ....
            .... values ' +
            '("' + edRechner.Text +
            '", "' + edRechnerNr.Text +
            ....
             '", "' + encode_data(memBemerkung.Text) + 
             '", "help1", "help2", "' + strAktDate + '")';
Diese Statement schicke ich dann mittels

Delphi-Quellcode:
if mysql_real_query(_myCon, query, Length(query)) = 1 then
zur DB. Hab auch schon die " durch ' ersetzt.

@DeddyH
Das mit dem escapen mach ich schon im Quelltext. So wie ich das gelesen haben machen die Funktionen AnsiQuotedStr() oder mysql_real_escape_string() doch nichts anderes als den Text in "" zu setzen.


Die Fehlermeldung sieht gekürzt wie folgt aus:

Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen (diese kann für verschiedene Server-Versionen unterschiedlich sein) bei '›?îœM29*tÆ&Ëf•ÕÄH®[6ÿ€3µ= ", "2009-11-14", "€4lÓfÛcã¦", .... in Zeile 1

Allerdings werden die Zeichen hier anders dargestellt als in der Meldung


Hoffe ihr habt noch weitere Ideen.

haentschman 19. Mär 2010 16:02

Re: MySQL : verschlüsselte Daten speichern
 
Hallo... :hi:
Zitat:

Hoffe ihr habt noch weitere Ideen.
...immer nur die selbe: Verwende Parameter !
Die ganzen Probleme welche aus ' und '' resultieren, sind damit Geschichte.

rawi 19. Mär 2010 23:58

Re: MySQL : verschlüsselte Daten speichern
 
Hallo Zusammen,

nun habe ich das Insert-Statement wie folgt abgeändert:
Delphi-Quellcode:
Format( 'insert into tblData (rechnername, rechnerno, ...
         ... help1, help2, aktdate) values ' +
         '(%s, %s, %s, ... , %s,%s, %s,%s, %s, %s)',
         [QuotedStr(edRechner.Text),
          QuotedStr(edRechnerNr.Text),
         ...
          QuotedStr(encode_data(memBemerkung.Text)),
          QuotedStr('help1'),
          QuotedStr('help2'),
          QuotedStr(strAktDate)]);
So hat es DeddyH hier (#322) empfohlen.
Ich denke mal so hat es auch haentschman gemeint.

Leider besteht das Problem nach wie vor.
Es liegt auch eindeutig an den verschlüsselten Werten, schreibe ich die Daten unverschlüsselt in das Insert-Statement funktioniert es ohne Probleme.

Vielleicht fällt ja doch noch jemandem etwas ein.

Danke und Gruß
rawi

Luckie 20. Mär 2010 00:13

Re: MySQL : verschlüsselte Daten speichern
 
Dekodiere sie noch der Verschlüssleung noch mit Base64 oder ähnlichen Methoden. Dann hast du nur darstellbare Zeichen, die auch gültig sind.

samso 20. Mär 2010 06:28

Re: MySQL : verschlüsselte Daten speichern
 
Zitat:

Das mit dem escapen mach ich schon im Quelltext. So wie ich das gelesen haben machen die Funktionen AnsiQuotedStr() oder mysql_real_escape_string() doch nichts anderes als den Text in "" zu setzen.
Das ist nicht ganz richtig. "mysql_real_escape_string" ersetzt einige Sonderzeichen durch eine Escape-Sequenz. Wichtig ist hier, dass das Escape-Zeichen "\" escaped wird, also zu "\\" gemacht wird. Auch sollten die Anführungszeichen korrekt escaped werden. Alle anderen Escape-Sequenzen sind eher kosmetischer Natur (Escape für #26, #13 und #10). In der aktuellen mysql.pas gibt es eine Delphi-Nachbildung der "mysql_real_escape_string". Diese heißt "EscapeString" und bietet zusätzlich den Vorteil mit dem Unicode-Delphi kompatible zu sein.

rawi 20. Mär 2010 10:37

Re: MySQL : verschlüsselte Daten speichern
 
So, Tip von Luckie hat geholfen. Das ganze noch mit Base64 behandelt und es funktioniert.

Danke

SirThornberry 20. Mär 2010 11:43

Re: MySQL : verschlüsselte Daten speichern
 
Was ich nicht verstehe - warum verwendest du keine Parameter? Es wurd dir mehrfach nahe gelegt und du bist kein bisschen darauf eingegangen. Wenn du die Daten encodierst wird die Datenmenge auch mehr. Würdest du hingegen mit Parametern arbeiten könntest du die Daten so wie du sie wirklich vorliegen hast in der Datenbank speichern und könntest damit Rechenleistung für das encodieren und Speicherplatz in der Datenbank sparen.
Dein ignorieren der Parameter Vorschläge empfinde ich derzeit wie folgt: Jemand friert im Auto und anstelle einfach die eingebaute Heizung anzustellen kauft er sich eine zusätzliche Batterie, einen Transformator und eine Elektroheizung mit 220 Volt Anschluss. Baut dann die Rücksitzbank aus damit genügend Platz dafür ist und freut sich :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz