Autor Beitrag
0x33
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 15.03.09 16:59 
hi, ich benutze zum umwandeln diese unit:
irsoft.de/web/Delphi-MD5

mein problem ist:
ich bekomme immer nen anderen md5 als bei der php funktion

z.B.
passwort = 8ef6df1f321676ecebea9ad399e0bb9b <- bei mir
passwort = e22a63fb76874c99488435f26b117e37 <- bei der php funktion

ich schätze mal das liegt irgendwie daran:
The code also works in Delphi 2009 without modifications. Please be aware that MD5 operates on bytes, though, so, as seen above, md5('test') will return two different hashes. To avoid this, you can e.g. use platform independent UTF-8 encoded strings and the UTF8String type in Delphi.

wie kann ich den fehler jetzt beheben?

bzw. hier noch:

md5('test') returns 098f6bcd4621d373cade4e832627b4f6, if 'test' are four plain bytes and c8059e2ec7419f590e79d7f1b774bfe6 if it's a unicode string. Yes, this can be confusing. <-- ich bekomme halt den 2. string (four plain bytes) dabei möchte ich den ersten erhalten^^

danke =)

Moderiert von user profile iconNarses: Titel geändert, Hilfe braucht jeder.
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 15.03.2009 um 23:01
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: So 15.03.09 17:15 
input ist zur Zeit nen String. Bei Delphi 2009 gilt ein "string" aber als Unicodestring. Um das zu beheben, musst du den input parameter als, glaub AnsiString heißt der, deklarieren.

_________________
PROGRAMMER: A device for converting coffee into software.
0x33 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 15.03.09 17:27 
also z.B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
test:ansistring;
begin
test := 'passwort';
Edit1.Text := md5(test);
end;

funzt allerdings leider auch nicht, ich krieg immer noch den gleichen (falschen) wert zurück :(

aber hab das hier gelesen:
...abgesehen von 4 Byte für den Zeiger auf nil, also ins Leere.... (ansi)

vll doch was anderes oder mach ich was falsch? =(

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: So 15.03.09 17:41 
user profile icon0x33 hat folgendes geschrieben Zum zitierten Posting springen:
also z.B. so:

var
test:ansistring;
begin
test := 'passwort';
Edit1.Text := md5(test);
end;

funzt allerdings leider auch nicht, ich krieg immer noch den gleichen (falschen) wert zurück :(

Äh? Ne, nicht da. Ich mein den Parameter von der Funktion md5.

_________________
PROGRAMMER: A device for converting coffee into software.
0x33 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 15.03.09 17:45 
also da?
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
function md5(const Input: String): String;
var
  hCryptProvider: HCRYPTPROV;
  hHash: HCRYPTHASH;
  bHash: array[0..$7fof Byte;
  dwHashBytes: Cardinal;
  pbContent: PByte;
  i: Integer;
begin
  dwHashBytes := 16;
  pbContent := Pointer(PChar(Input));
  Result := '';
  if CryptAcquireContext(@hCryptProvider, nilnil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then
  begin
    if CryptCreateHash(hCryptProvider, CALG_MD5, 00, @hHash) then
    begin
      if CryptHashData(hHash, pbContent, Length(Input) * sizeof(Char), 0then
      begin
        if CryptGetHashParam(hHash, HP_HASHVAL, @bHash[0], @dwHashBytes, 0then
        begin
          for i := 0 to dwHashBytes - 1 do
          begin
            Result := Result + Format('%.2x', [bHash[i]]);
          end;
        end;
      end;
      CryptDestroyHash(hHash);
    end;
    CryptReleaseContext(hCryptProvider, 0);
  end;
  Result := AnsiLowerCase(Result);
end;


result is doch aber ansi oO.. :(

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt und Leerzeilen entfernt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: So 15.03.09 17:53 
Den PARAMETER, nicht den Rückgabewert.

_________________
PROGRAMMER: A device for converting coffee into software.
0x33 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 15.03.09 23:55 
also hier was abändern oder in der componente? oO ich raff das nich un nix funzt =D
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 16.03.09 00:48 
Du solltest dir echt mal die Grundlagen anschauen..

ausblenden Delphi-Quelltext
1:
function md5(const Input: String): String;					

DAS ist ein Parameter. Der ist im Moment vom Typ string. Da dies in Delphi 2009 aber für Unicode steht, sollst du es mit AnsiString (oder wie der Typ heißt..) versuchen. Vielleicht geht dies besser.

_________________
PROGRAMMER: A device for converting coffee into software.
0x33 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 16.03.09 01:08 
jo, sry hab ich vergessen, das hab ich schon ausprobiert.. allerdings kommt immer noch ein anderer md5 string raus als beim php script.. :(

jetzt kommt der hier: 706092f5372167d10ab2119156edb1f4
dabei sollte er so aussehen: 098f6bcd4621d373cade4e832627b4f6
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: Mo 16.03.09 10:46 
Teste mal hiermit: www.paehl.de/cms/fastmd5_deutsch. Das gibt auf jeden Fall den richtigen Wert. Schau auch mal unter [url]www.koders.com[/url] Da gibts MD5-Routinen für 16 und 32bit. Die verwende ich selber und weiß, dass sie funktionieren.
Gruß Delphi10

EDIT: Zumindest hast du mit dem FastMD5 die Möglichkeit festzustellen, welcher deiner beiden Werte den nun der Richtige ist.

_________________
Salus populi suprema lex esto
0x33 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 16.03.09 13:57 
so, also ich habs jetzt in der schule noch mit delphi 2007 probiert und da wird der richtige wert ausgegeben, liegt wohl wirklich an der codegear 2009 version wegen unicode und ansicode

wenn ich allerdings nur den parameter der funktion ändere kommt trotzdem das falsche, vll kann sich das ja mal wer genauer anschauen und mir sagen was ich abändern muss? danke^^

@delphi10 danke, ich werd mir das jetzt auch mal noch anschauen :)