Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 19. Mär 2024, 16:26
Bei Indy würde ich immer enUTF8 angeben, ansonsten wird wie bereits gesagt intern immer das ASCII encoding genutzt, was einfach alle Zeichen größer $7F als '?' interpretiert - siehe TIdASCIIEncoding.GetBytes in IdGlobal.pas

Ebenso musst du bei DEC dafür sorgen, dass er einen UTF8 String hasht und nicht einen UnicodeString (UTF16) - das kann man einfach mit einem Cast auf UTF8String bewerkstelligen, hier baut der Compiler immer die notwendige Konvertierungsfunktion ein. Durch die Überladung von CalcString mit RawByteString wird dann diese aufgerufen.

Delphi-Quellcode:
  var lMD5_Indy := TIdHashMessageDigest5.Create;
  try
    var sValue := lMD5_Indy.HashStringAsHex('Tästwert', enUTF8);
    Writeln(sValue);
  finally
    lMD5_Indy.Free;
  end;

  var lMD5_DEC := THash_MD5.Create;
  try
    var sValue := lMD5_DEC.CalcString(UTF8String('Tästwert'), TFormat_HEX);
    Writeln(sValue);
  finally
    lMD5_DEC.Free;
  end;
Ausgabe (Obacht, ich hab da nen ä in den String geschmuggelt, um das mit dem UTF8 zu testen):

9C6F9390DE3580AA8717DAA21D1E3622
9C6F9390DE3580AA8717DAA21D1E3622

Laut diverser online md5 Generatoren ist das wohl richtig.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat