PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AES_DECRYPT funktioniert nicht


Mozzarella
13.03.2007, 13:20:27
Hallo,

ich möchte Passwörter für ein htaccess-geschütztes Verzeichnis verschlüsselt zunächst in einer Datenbnk speichern.

Das Ablegen funktioniert so (und klappt auch):
$sql = "INSERT INTO benutzer (name, email, benutzername, passwort) VALUES (
'".addslashes($absender)."',
'".addslashes($eMail)."',
'".addslashes($benutzer)."',
AES_ENCRYPT('$passwort', 'enigma'))";
$result = mysql_query($sql);

Die Werte werden in einer BLOB-spalte gespeichert.

Das Auslesen funktioniert aber nicht, es wird irgendwie kein Wert zurückgegeben:
$sql = "SELECT id, name, AES_DECRYPT(passwort, 'enigma') FROM benutzer WHERE erlaubt = 'nein' ORDER BY name";
$result = mysql_query($sql);
while ($ds = mysql_fetch_object($result)) {
$index = $ds->id;
$person = $ds->name;
$decodiert = $ds->passwort;
...

Ich verstehe nicht, wo das der Fehler liegt!?

P.S. "erlaubt" ist eine weitere Spalte, die defaultmäßig auf "nein" gesetzt und daher im oberen SQL-String nicht aufgeführt wird.

meikel (†)
13.03.2007, 13:32:12
Welchen Spaltentyp hat passwort?

AES_ENCRYPT() encrypts a string and returns a binary string. AES_DECRYPT() decrypts the encrypted string and returns the original string.

Mozzarella
13.03.2007, 23:41:37
Gemäß der Referenz habe ich ein BLOB verwendet. Wenn ich den Spaltentyp später in VARCHAR ändere, kommen erwartungsgemäß Hieroglyphen dabei heraus. Das Speichern funktioniert also. warum dann nicht das Auslesen?

meikel (†)
14.03.2007, 01:06:55
Das Speichern funktioniert also. warum dann nicht das Auslesen?
Deshalb (eben erst gesehen):

SELECT id, name, AES_DECRYPT(passwort, 'enigma') FROM benutzer WHERE erlaubt = 'nein' ORDER BY name

$decodiert = $ds->passwort;
Da hätte PHP meckern müssen, weil es kein $ds->passwort gibt. Da fehlt schlicht und einfach nach dem Funktionsterm ein Alias

Mozzarella
16.03.2007, 00:21:52
Ah, so langsam kapiere ich es: Wenn ich eine Funktion in SQL verwende, muss ich anschließend einen Term angeben, an den übergeben wird, oder?
Hatte ein ähnliches Problem mit der Funktion DATE_FORMAT (auch in diesem Forum gepostet).

Danke sehr!

meikel (†)
16.03.2007, 01:22:37
Ah, so langsam kapiere ich es: Wenn ich eine Funktion in SQL verwende, muss ich anschließend einen Term angeben, an den übergeben wird, oder?
Einen "Ersatzbezeichner" (Alias):
In der Mathematik bezeichnet Term einen sinnvollen Ausdruck, der Ziffern, Variablen, Symbole für mathematische Verknüpfungen und Klammern enthalten kann.
Das ist ein Term:
AES_DECRYPT(passwort, 'enigma')
Da PHP das nicht als Namen für eine Methode verwenden kann, mußt Du einen Alias angeben:
AES_DECRYPT(passwort, 'enigma') AS lesbares_passwort
damit Du damit arbeiten kannst (MySQL benötigt an dieser Stelle keinen Alias, aber der MySQL Client):
echo $row->lesbares_passwort;