Hi!
Wie gesagt. Angeblich soll man ja mit AES_ENCRYPT den Typ VARBINARY or BLOB nehmen.
Ich habe mit dem phpMyAdmin und dem AES_ENCRYPT etwas experimentiert. Auf der Startseite ist als "connection collation" utf8_... gewählt, Zeichen werden also UTF8-kodiert, die Kollation spielt erstmal keine Rolle.
SELECT
AES_ENCRYPT('föo','bar'),
AES_ENCRYPT(CONVERT('föo' USING latin1),'bar')
Das ergibt unterschiedliche Werte. AES_ENCRYPT() arbeitet also byteorientiert. Unicode-Codepoint-orientiert zu arbeiten ergibt keinen richtigen Sinn, denn diese Codepoints sind abstrakte Zahlen, die keine konkreten, für den Rechner nutzbaren Werte darstellen. Sie müssten dazu in eine konkrete Form gebracht werden, wie beispielsweise UTF-16 oder UTF-8. In diese Form müssten dann aber alle anders kodierten Werte gebracht werden, um vergleichbare Ergebnisse zu erzielen, wenn man mit den Zeichen an sich und nicht ihrer konkreten, irgendwie kodierten Form arbeiten wollte.
Wie auch immer, die Bytewerte interessieren. Und wenn du bei anscheinend gleichen Rechenschritten unterschiedliche Ergebnisse bekommst, so liegt dir Vermutung nahe, dass du mit unterschiedlichen Kodierungen arbeitest.
Überprüfen könntest du das, indem du mal das SELECT wegkommentierst und stattdessen ein INSERT ausführst (mit gleichem Passwort aber mit anderem Benutzernamen, denn da wird sicher ein unique key draufliegen). Die Werte für beide Benutzer kannst du anschließend zum Beispiel im PMA vergleichen. Sie sollten übereinstimmen, was sie aber vermutlich nicht tun werden.
Als nächstes könntest du das AES_ENCRYPT() an beiden Stellen (beim normalen INSERT und beim testweisen) entfernen und mal Klartext-Passwörter speichern. Dann solltest du deutlicher sehen, was aus den Werten wird, wenn du dir das Ergebnis im PMA anschaust.
Auf alle Fälle solltest du VARBINARY als Feldtyp verwenden und eine ausreichende Feldgröße wählen. Die Doku zu AES_ENCRYPT spricht von
16 × (trunc(string_length / 16) + 1)
wobei du beachten musst, dass 1 Zeichen UTF-8-kodiert bis zu 4 Byte lang werden kann.
Lo!