Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bekanntes Problem MD5 und Unicode


Cyberaxx - Mi 21.12.11 00:37
Titel: Bekanntes Problem MD5 und Unicode
Hallo

Mittlerweile bin ich seit einer ganzen weile am Suchen, hier, DP, Google aber wirklich fündig bin ich nicht geworden.

Ich suche eine funktionierende Version um einen MD5 Hash zu erzeugen unter Delphi 2010 und das ohne eine ganze Tool Sammlung zu installieren.

Sämtliche Anpassungen an den bekannten MP5.pas sind leider fehlgeschlagen sie stimmen einfach nicht mit der von MYSQL überein.

Hat hier vllt. jemand eine Lösung ohne eben eine ganze Sammlung zu installieren?

MfG Cyber


jaenicke - Mi 21.12.11 00:49

Wie wäre es mit Indy (TIdHashMessageDigest5 aus IdHashMessageDigest)? Das ist schließlich schon mit Delphi mitgeliefert und sollte daher am einfachsten sein. ;-)


Cyberaxx - Mi 21.12.11 08:38

In all den Stunden die ich gesucht habe, ist niemand auf die Idee gekommen an gegebenfalls mal an die Indies zu denken.
Es kam mal auf das ich glaube etwas von Fundamentals glaube ich. So viel wollte ich natürlich nicht installieren.

Die md5.pas war halt recht einfach gehalten.

Ich werde mir nachher mal die Unit von den Indies anschauen. Danke erstmal.


Gausi - Mi 21.12.11 08:55

Die Unit, die ich dafür mal hier im Forum gefunden habe, führte sämtliche Berechnungen auf eine Funktion zurück, die als Parameter nur einen Pointer und eine Länge erwartet hat. Diese Unit konnte man dann einfach so Unicodefähig machen:


Delphi-Quelltext
1:
2:
3:
4:
function MD5UnicodeString(const S: UnicodeString): TMD5Digest;
begin
  Result := MD5Buffer(PWideChar(S)^, Length(S) * sizeOf(WideChar));
end;


Und wenn das nicht mit dem Hash von MYSQL übereinstimmt, dann könnte man sowas probieren:


Delphi-Quelltext
1:
2:
3:
4:
function MD5UTF8String(const S: UTF8String): TMD5Digest;
begin
  Result := MD5Buffer(PAnsiChar(S)^, Length(S));
end;


Cyberaxx - Mi 21.12.11 09:13

:)

Hast denn die Unit noch? Sitze gerade auf der Arbeit und habe kein Delphi vor mir.
Habe halt bei meiner auch schon einiges versucht anzupassen nachdem was ich so gelesen hatte.
Letzteres war dann, das ich eine andere md5.pas genommen habe aber die schon beim kompilieren Probleme machte.


Gausi - Mi 21.12.11 11:03

Wo ich die genau gefunden habe, weiß ich nicht mehr, und die Seite, die im Quellcode vermerkt ist, gibt es nicht mehr. Die ist aber im Anhang in diesem Topic [http://www.delphi-forum.de/topic_ScrobblerUtils_91234.html] dabei. Da habe ich die iirc um die UTF8-Variante erweitert.


Cyberaxx - Mi 21.12.11 20:18

Es funktioniert :)

Warum ist der MD5 String eigentlich uppercase? Ich mein wenn ich mir dagegen die MD5 von MySQL anschaue ist dort alles Lowercase


jaenicke - Mi 21.12.11 21:31

Das ist vollkommen egal, da es sich um hexadezimale Ziffern handelt. ;-)


Cyberaxx - Mi 21.12.11 21:35

Ja und Nein

Wenn ich

Delphi-Quelltext
1:
2:
3:
4:
5:
Format('SELECT * FROM users WHERE username = %s', [UserName]);
...
if MD5String(Passwort) = DataSource.DataSet.FieldByName('password').AsString then begin
...
end;


versuche gehts natürlich in die Hose. Auch wen ndas nun kein schönes Beispiel ist, so ist es ja nunmal so.
Hab nun einfach nen lowerCase davor gesetzt und meine Welt ist wieder in Ordnung :)


jaenicke - Do 22.12.11 00:05

Wie wäre es zum Vergleich mit AnsiSameText? :zwinker:


Cyberaxx - Do 22.12.11 18:40

Da gefällt mir LowerCase aber doch schon besser :)


Delphi-Quelltext
1:
AnsiSameText(Str1, Str2) =                    


<>


Delphi-Quelltext
1:
str1 = str2                    


Boldar - Fr 23.12.11 02:21

user profile iconCyberaxx hat folgendes geschrieben Zum zitierten Posting springen:



Delphi-Quelltext
1:
AnsiSameText(Str1, Str2) =                    


<>


Delphi-Quelltext
1:
str1 = str2                    


Hat ja auch niemand behauptet... :gruebel: