| Autor |
Beitrag |
0x33
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 Narses: Titel geändert, Hilfe braucht jeder.Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am So 15.03.2009 um 23:01
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: So 15.03.09 17:27
also z.B. so:
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 Narses: Delphi-Tags hinzugefügt
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: So 15.03.09 17:41
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
0x33 
Hält's aus hier
Beiträge: 13
|
Verfasst: So 15.03.09 17:45
also da?
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..$7f] of Byte; dwHashBytes: Cardinal; pbContent: PByte; i: Integer; begin dwHashBytes := 16; pbContent := Pointer(PChar(Input)); Result := ''; if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then begin if CryptCreateHash(hCryptProvider, CALG_MD5, 0, 0, @hHash) then begin if CryptHashData(hHash, pbContent, Length(Input) * sizeof(Char), 0) then begin if CryptGetHashParam(hHash, HP_HASHVAL, @bHash[0], @dwHashBytes, 0) then 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 Narses: Code- durch Delphi-Tags ersetzt und Leerzeilen entfernt
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: So 15.03.09 17:53
Den PARAMETER, nicht den Rückgabewert.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
0x33 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 16.03.09 00:48
Du solltest dir echt mal die Grundlagen anschauen..
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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: 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 
Hält's aus hier
Beiträge: 13
|
Verfasst: 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 
|
|