Mysql Probleme mit BLOB

Sprint

Erfahrenes Mitglied
Hallo zusammen,

ich muß einige mit mcrypt verschlüsselten Werte in einer DB speichern und hab dazu den BLOB Typ gewählt, damit auch wirklich alle Daten erhalten bleiben. Nun hat sich aber ein sehr merkwürdiges Verhalten gezeigt.

Zum Testen hab ich mal dieses kurze Script gebaut:

PHP:
$wert = 'yxcvbn';
$schluessel = 'bjBRkV6Xzq3R0IcRCI+Fp12P6h7T5yAd';
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

$enc_wert = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $schluessel, $wert, MCRYPT_MODE_ECB, $iv);
$sql = "update tabelle set mycrypt = '$enc_wert';";
$erg = mysql_query($sql, $verbindung);

$sql="select * from tabelle limit 1;";
$erg=mysql_query($sql,$verbindung);     //Datanbankanfrage senden
$vkk = mysql_fetch_array($erg);

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $schluessel, $vkk['mycrypt'], MCRYPT_MODE_ECB, $iv);

echo $decrypt;

Dabei ist mir aufgefallen, daß die zu verschlüsselnden Werte relativ oft falsch abgelegt werden, da die Entschlüsselung nicht immer klappt.

So wird z.B. "qwertz" wieder richtig entschlüsselt, "yxcvbn" oder "poiuzt" hingegen nicht. Da kommt nur irgendwelcher Murks bei raus. Da die Entschlüsselung ohne das zwischenzeitliche Speichern in der DB aber immer funktioniert, kann es ja mMn nur an MySQL liegen.

Wie kann ich mir jetzt aber sicher sein, daß später die echten Daten wieder korrekt vorliegen, wenn sie gebraucht werden?
 
Jetzt arbeitest du zur Sicherheit mit Verschlüsslung und brauchst immer noch mysql_x.
Nimm besser mysqli oder pdo.
http://www.mysqltutorial.org/php-mysql-blob/

msql_x ist seit Jahren veraltet und wird in den neuen PHP-Version NICHT MEHR UNTERSTÜTZT!

Aber ehrlich. Wenn die Verschlüsselten Daten ein String sind, dann ich BLOB doch eh der falsche Feldtyp. TEXT währe mMn besser.
 
Abgesehen davon, daß die Zugriffsmethode hier keine Rolle spielt, liegt es daran, daß es eine Erweiterung für ein bestehendes Projekt ist. Ein kompletter Neubau ist für nächstes Jahr angesetzt und da werde ich jetzt nicht mehr großartig was ändern. Außerdem ist es ja im Moment nur ein erster Test.

Wenn es ein normaler Text wäre, würde ich auch kein BLOB verwenden. Aber mcrypt Ergebnisse sind alles andere als Texte. Wenn ich mir die verschlüsselten Werte anzeigen lasse, kommt z.B. sowas bei raus: '�5�� �+:k\�?�� �sE�5�l��w.�a�p'

Inzwischen hat sich das Problem auch noch dahingehend erweitert, daß bei manchen Vorgängen normale Anführungszeichen entstehen, die dann natürlich das SQL Statement zerhacken. Und ich befürchte, daß wenn ich die irgendwie escape, die Entschlüsselung nicht mehr klappt.

EDIT: Es kommt mir eher wie binäre Daten vor, und was gibt es da anderes als BLOB?
 
Man sollte aber einen BLOBB nicht als String übergeben.
Naja. Ansonsten fersuchs mal mit mysql_real_escape_string() oder sowas.
Habe die mysql_x Befehle nicht mehr aktiv im Gedächnis.
 
mysql_real_escape_string() hilft tatsächlich beim Schreiben und macht auch beim Entschlüsseln keinen Ärger. Hätte ich jetzt nicht gedacht. Danke für den Tip!
 
Zurück