Daten verschlüsselt in DB speichern und wieder auslesen

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
McHubi
Beiträge: 1223
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von McHubi »

Hallo zusammen,

das Abspeichern, Auslesen und Verändern von Daten in meiner DB-Tabelle funktioniert tadellos. Allerdings nicht mehr, wenn eine Verschlüsselung hinzu kommt. Als Name wird hier "Waldfee" verwendet.

INSERT:

Code: Alles auswählen

function encrypt($string,$key) {
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
$iv = mcrypt_create_iv($size, MCRYPT_RAND); 
return mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv);
}
...
$name=encrypt($name,$key);
$prename=encrypt($prename,$key);
...
$insert="INSERT INTO table (name,prename) VALUES ('$name','$prename')";
Lass ich mir mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv); direkt in der function encrypt ausgeben, kommt dies dabei herum:
l�j�Sȏ+�z�i�lmf�*:����n�Ő����
In der DB-Tabelle wird statt dessen jedoch
l?j?S?+?z?i?lmf?*:????n??????
eingetragen.

AUSLESEN

Code: Alles auswählen

function decrypt($string,$key) {
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
$iv = mcrypt_create_iv($size, MCRYPT_RAND); 
return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv);
}
...
$query = "SELECT * FROM table";
$result = cRegistry::getDb();
$result->query($query);
while($result->nextRecord()) $arr=$result->toArray();
...
echo decrypt($arr[name],$key);
...
Statt des eigentlichen Namens "Waldfee" wird hier jetzt ausgegeben:
f�%�Ձde5!����g�O���):�'Q

Zeichensatzproblem beim Speichern? Wenn ja, hat jemand einen Tipp für mich?

CONTENIDO Version 4.9.3
Webserver-Version Microsoft-IIS/7.5
Installierte PHP-Version 5.3.24
Datenbankserver-Version 5.1.72-community
PHP-Datenbankerweiterung mysqli

Vielen Dank! :D


Markus
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von xmurrix »

Morgen McHubi,

Fragezeichen in ausgegebenen Strings sind ein Hinweis dafür, dass der String wohl ein Multibyte-Encoding hat, aber vermutlich nicht die Umgebung. Daher kann es sein, dass die DB beim Speichern/Lesen von einem anderen Encoding ausgeht und dabei den Inhalte des falsch übernimmt.

Probiere doch mal base64_encode und base64_decode, also:

Code: Alles auswählen

function encrypt($string,$key) {
...
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv));
}

function decrypt($string,$key) {
...
return base64_decode(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv));
}
Mit base64 Kodierung solltest du auf der sicheren Seite sein.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
McHubi
Beiträge: 1223
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von McHubi »

Hallo Murat,

Danke Dir für Deinen "der frühe Vogel fängt den Wurm" Tipp! :D

Klappte nicht direkt - die Fragezeichen waren zwar bei
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv));
weg, allerdings kamen sie bei
return base64_decode(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB, $iv));
wieder.

Habe "spaßeshalber" utf8_encode und utf8_decode probiert, aber das brachte auch nichts. Dann habe ich einmal alle Tabellenspalten auf "TEXT" gesetzt um Speicherprobleme zu vermeiden. Einige waren INT, DATE usw., so dass hier der String der Verschlüsselung nicht zum Format passte. Bei TEXT sollte aber alles reinpassen. Ging aber immer noch nicht.

Lösung
Es gab ein Reihenfolgeproblem beim Dekodieren, wenn das base64_decode zum Schluss angewendet wird:
String -> verschlüsseln -> base64_encode -> speichern -> auslesen -> entschlüsseln -> base64_decode -> string

Richtig ist diese Reihenfolge:
String -> verschlüsseln -> base64_encode -> speichern -> auslesen -> base64_decode -> entschlüsseln -> string

Insofern blieben die Tabellenspalten auf TEXT und das base64_decode habe ich auf den String begrenzt:

Code: Alles auswählen

mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($string), MCRYPT_MODE_ECB, $iv);
Jetzt läuft es! Danke Dir nochmal! :mrgreen:

Edit:
Das Dumme ist nur, dass jetzt beim Dekodieren hinter das korrekt Dekodierte zig Fragezeichen-Icons angehängt werden:
Honig���������������������������
Die bekomme ich nur weg mit

Code: Alles auswählen

$not_allowed = array("�");
return str_replace($not_allowed, "",mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($string), MCRYPT_MODE_ECB, $iv));
Das gilt jedoch nur für das reine Darstellen der Informationen. Wird der String in ein <input>-Feld oder eine <textarea> als value übergeben, sind die Fragezeichen immer noch da... :cry:

Gruß,

Markus
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
Zuschauer
Beiträge: 141
Registriert: Do 5. Dez 2013, 08:57
Kontaktdaten:

Re: Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von Zuschauer »

Hallo Markus,

die "Auffüllung" mit Fragezeichen (NULL-Zeichen) liegt am Speicherdatentyp TEXT.
Nimm lieber VARCHAR, denn das ist in der Feldlänge variabel (hat eine Maximallänge, keine zwingende Länge).

Gruß
Zuschauer
McHubi
Beiträge: 1223
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von McHubi »

Hallo Zuschauer,

habe auf VARCHAR(xyz) umgestellt. Hilft leider nicht... :?
Wenn ich nur encodiere aber nicht decodiere, dann werden die input-Felder nicht mit Fragezeichen zugemüllt. Das Kuriose ist aber, dass diese Fragezeichen ausschließlich dann vorkommen, wenn sie als value in input-Feldern eingebunden werden.

Lösung: Ergänzung der nicht erlaubten Zeichen im Array:

Code: Alles auswählen

$not_allowed = array("�","\x0");
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
Zuschauer
Beiträge: 141
Registriert: Do 5. Dez 2013, 08:57
Kontaktdaten:

Re: Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von Zuschauer »

Hallo Markus,

die bloße Umstellung des Datentyps in der Tabelle kürz die Feldinhalte natürlich nicht.
Aber du hast ja schon eine für dich passende Lösung gefunden :)

Gruß
Zuschauer
McHubi
Beiträge: 1223
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von McHubi »

Moin zusammen,

@Zuschauer: Ja, das stimmt. :)
Was noch wichtig ist: bei der Verschlüsselung werden unter Umständen "+" erzeugt. Hängt man den Inhalt eines Feldes als Inhalt einer Variablen an eine URL
www.meinedomain.de/index.php?suche_nach ... zcAK6K9l0=
geht das "+" beim auslesen per GET verloren und wird durch ein Leerzeichen ersetzt.
In der Datenbank wird dann natürlich nichts gefunden. Insofern muss das Leerzeichen wieder per $suche_nach=str_replace(' ','+',$suche_nach); in ein "+" umgewandelt werden.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)
Faar
Beiträge: 1951
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Hat sich bedankt: 15 Mal
Kontaktdaten:

Re: Daten verschlüsselt in DB speichern und wieder auslesen

Beitrag von Faar »

Moin,

ich würde es nicht mit strstr() ändern sondern mit urlencode(), das macht aus den Sonderzeichen wie + ein %-codiertes Zeichen.

Code: Alles auswählen

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
VG,
Frank
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Antworten