AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MD5 - Unterschiede zw. Indy und DEC6

Ein Thema von dschiffler · begonnen am 19. Mär 2024 · letzter Beitrag vom 22. Mär 2024
Antwort Antwort
Seite 1 von 2  1 2      
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 19. Mär 2024, 15:55
Ich habe momentan DEC nicht installiert.
Aber wenn's immer noch so ist wie früher: Mit DEC wird doch ein Testprogramm für alle eingebauten Hash Funktionen mitgeliefert.
Hast du dort überprüft wie DEC die MD5 Testwerte berechnet? Ich nehme mal an, TurboMagic hat die Werte aus dem RFC1321 gewählt.
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

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
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 19. Mär 2024, 17:07
ich habe "Testwert" (natürlich ohne ") in das DEC-Hash eingegeben und erhalte das beigefügte Ergebnis genau wie mit Indy.
Ich habe für das Programm DEC Hash Vcl DEC 6.41 (also das aktuelle DEC) verwendet.
Angehängte Grafiken
Dateityp: jpg md5hash.jpg (64,7 KB, 29x aufgerufen)
Norbert

Geändert von EdAdvokat (19. Mär 2024 um 17:22 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.045 Beiträge
 
Delphi 12 Athens
 
#4

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 19. Mär 2024, 20:23
Hallo,

schön, dass ihr das schon alleine rausbekommen habt.
Danke an SGlienke!

Nach dem halt UnicodeString in DelphiUTF16 ist, würde ich so ein
Verhalten auch ehrlicherweise erwarten.

Warum?

1. Weil es wie von Stefan richtig bemerkt ja extra eine RawByteString
Variante davon gibt die man in den anderen Fällen nutzen kann.

2. Man sonst bei wirklicher Ausnutzung eines UnicodeString/string
mit Zeichen > 255 Schwierigkeiten hätte. Dann bräuchte man gar keine
Variante mit UnicodeString/string anzubieten.

Grüße
TurboMagic
  Mit Zitat antworten Zitat
dschiffler

Registriert seit: 25. Okt 2006
30 Beiträge
 
Delphi 12 Athens
 
#5

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 20. Mär 2024, 07:59
Hallo,

danke an Stefan für den Hinweis zu UTF8.

Allerdings kann ich bei Indy nichts am Aufruf von HashStringAsHex ändern, da die Klasse TIdHashMessageDigest5 intern in TIdDigestAuthentication verwendet wird.

Frage an TurboMagic:
Die Hash-Methode von Delphi (System.Hash.THashMD5.GetHashString) kann ich ganz normal mit einem String aufrufen, da dort intern eine Umwandlung des Parameters erfolgt (TEncoding.UTF8.GetBytes(...)).
Wäre das nicht auch bei den DEC-Funktionen sinnvoll, damit man die Umwandlung mit UTF8String nicht immer selber machen muss?
Liebe Grüße
Dirk Schiffler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#6

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 20. Mär 2024, 09:16
Du kannst die String-Variable auch einfach als UTF8String deklarieren, anstatt als string .
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.045 Beiträge
 
Delphi 12 Athens
 
#7

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 20. Mär 2024, 17:34
Hallo,

ich bin mir noch nicht sicher ob ich Himitsu richtig verstehe.
Wenn man einen normalen String mit den DEC string Funktionen benutzt ist der ja
UTF16 in Delphi. Weißt man einen UTF8String einem String zu dürfte der ja in UTF16
konvertiert werden, oder?

Dann käme ja nicht das richtige raus.
Wenn man die DEC erweitern möchte (weil es zu müßig ist RawByteString Typecasts
hinzuschreiben, dann müsste man wohl noch UTF8String basierte Overloads hinzufügen.

Oder was hab' ich jetzt falsch verstanden?

Falls wir uns einig werden was der richtige Ansatz ist bin ich auch für Codespenden dankbar

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#8

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 20. Mär 2024, 18:24
Gäbe es bloß ein CalcString mit string, würde es stimmen.

Aber da es eine Überladung mit einem kompatiblen Typen zum UTF8String gibt, wird Jenes verwendet, also RawByteString.



Bei einer Überladung von String (bzw. UnicodeString/WideString) und AnsiString, da wird es schwieriger.
Vor 2009 wäre der UTF8String in jeden anderen AnsiString-Typen übergegangen, womöglich sogar ohne Konvertierung.
Jetzt wird es komplizierter. Ich würde hoffen es ginge da auf String/UnicodeString, aber es wäre auch möglich, dass es mit Konvertierung in den AnsiString ginge (was blöd wäre).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (20. Mär 2024 um 18:41 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#9

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 20. Mär 2024, 20:45
Ich habe noch eine etwas ältere Version von DEC (Version 6.2 laut readme).
Delphi-Quellcode:
function TDECHash.CalcString(const Value: RawByteString; Format: TDECFormatClass): RawByteString;
var
 Buf: TBytes;
begin
 Result := '';
 if Length(Value) > 0 then
  {$IF CompilerVersion >= 24.0}
  Result := BytesToRawString(ValidFormat(Format).Encode(CalcBuffer(Value[low(Value)], Length(Value) * SizeOf(Value[low(Value)]))))
  {$ELSE}
  Result := BytesToRawString(ValidFormat(Format).Encode(CalcBuffer(Value[1], Length(Value) * SizeOf(Value[1]))))
  {$IFEND}
 else
  begin
   SetLength(Buf, 0);
   Result := BytesToRawString(ValidFormat(Format).Encode(CalcBuffer(Buf, 0)));
  end;
end;
Hier kommt der richtige MD5-Hash raus.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.045 Beiträge
 
Delphi 12 Athens
 
#10

AW: MD5 - Unterschiede zw. Indy und DEC6

  Alt 22. Mär 2024, 18:33
Naja, in deinem Fall ist auch klar warum das richtige raus kommt:
Die benutzt RawByteString, also 8-Bit pro Zeichen.

Und wie ja schon ermittelt wurde kommt auch bei der aktuellen Version
das richtige raus, wenn man das richtige Overload aufruft.
=> also ggf. TypeCast

Grüße

TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz