![]() |
SHA-3 von Wolfang Ehrhardt
Moinmoin,
bin etwas verwirrt. Ich wollte, zum sicheren Speichern von Passwörtern in einer DB, die Passwörter Hashen. Ok,..aktueller Stand dürfte SHA3 sein und fand die Implementierung von Wolfgang Ehrhardt. Hab das ganze auch ohne große Sache integrieren können. Nur funktionieren wills nicht so wirklich. Bei jedem Programmstart bekomme ich, obwohl die Eingangsdaten identisch zu den anderen Aufrufen sind, einen anderen Hash ??
Delphi-Quellcode:
Dabei ist aString immer PWD+Salz. Aber wie gesagt, bekomme ich bei jedem Start des Programms, einen anderen
function CreateHash(aString:string):string;
var Context : THashContext; Digist : TSHA3_512Digest; //bytes : Array of Byte; size : Integer; Bytes : TBytes; begin SHA3_512Init(Context); size := aString.Length * SizeOf(Char); Bytes := TEncoding.Default.GetBytes(aString); SHA3_512Update(Context,@bytes,size); SHA3_512Final(Context,Digist); result := Base64Str(@Digist,sizeof(Digist)); end; Hash, obwohl PWD+Salz immer gleich ist. Findet ihr hier einen Fehler ? Danke schonmal :) |
AW: SHA-3 von Wolfang Ehrhardt
Ich kenne die Biblothek nicht, aber müsste es nicht eher so lauten?
Delphi-Quellcode:
SHA3_512Update(Context,@Bytes, Length(Bytes));
|
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
Bei jedem Programmstart bekomm ich unterschiedliche Hashes. |
AW: SHA-3 von Wolfang Ehrhardt
Hast du kontrolliert, ob Bytes immer gleich ist?
Vielleicht ergibt sich da schon die Abweichung? |
AW: SHA-3 von Wolfang Ehrhardt
Die Bytes die rein gehen sind immer die gleichen. Das was raus kommt (digist ist auch ein Byte-Array) ist immer anders.
|
AW: SHA-3 von Wolfang Ehrhardt
Vielleicht so:
Delphi-Quellcode:
SHA3_512Update(Context,Pointer(bytes),Length(bytes));
|
AW: SHA-3 von Wolfang Ehrhardt
Autsch.....:wall::wall:
das
Delphi-Quellcode:
muss
SHA3_512Update(Context,@bytes,size);
Delphi-Quellcode:
sein.
SHA3_512Update(Context,@bytes[0],size);
Er braucht die Adresse des 1. Bytes im Array, nicht die Adresse der Array-Variable. Trotzdem Danke :) |
AW: SHA-3 von Wolfang Ehrhardt
Du bist ein Opfer der Compiler-Magie gewerden. Nach der Deklaration
Delphi-Quellcode:
ist Bytes (natürlich?) ein Pointer und mit
Bytes : TBytes;
Delphi-Quellcode:
berechnest Du nicht den Hash von Bytes sondern den Hash des Pointers (und der ändert sich in der Regel, weil ja die Speicheraddresse sich je nach Allokation ändert).
@bytes
Mit der korrigierten Version
Delphi-Quellcode:
program t_dp_ex;
uses system.hash, system.sysutils, btypes, mem_util, hash, sha3_512; {$i std.inc} {$ifdef APPCONS} {$apptype console} {$endif} {-----------------------------------------} function CreateHash(aString:string):string; var Context : THashContext; Digist : TSHA3_512Digest; //bytes : Array of Byte; size : Integer; Bytes : TBytes; begin SHA3_512Init(Context); size := aString.Length * SizeOf(Char); Bytes := TEncoding.Default.GetBytes(aString); SHA3_512Update(Context,bytes,size); SHA3_512Final(Context,Digist); result := Base64Str(@Digist,sizeof(Digist)); end; begin writeln(CreateHash('abc1234')); end.
Code:
Gruß Gammatester
erhalte ich immer das gleiche Ergebnis:
G:\CRC_HASH>t_dp_ex.exe Zzvn3sQanFpmGDltaWoEMPBRm4tEtBzAP22pOKoe3X1TCY4VN5K8a0cFNWBDOYo8oNInfUYU/tNJWDFf XXftyA== G:\CRC_HASH>t_dp_ex.exe Zzvn3sQanFpmGDltaWoEMPBRm4tEtBzAP22pOKoe3X1TCY4VN5K8a0cFNWBDOYo8oNInfUYU/tNJWDFf XXftyA== G:\CRC_HASH>t_dp_ex.exe Zzvn3sQanFpmGDltaWoEMPBRm4tEtBzAP22pOKoe3X1TCY4VN5K8a0cFNWBDOYo8oNInfUYU/tNJWDFf XXftyA== |
AW: SHA-3 von Wolfang Ehrhardt
Ich kann weiterhin nicht glauben, dass size=Length(Bytes) gilt. Wieso soll die Länge des Strings nach der Umkodierung die Größe (in Bytes) des Strings vor der Umkodierung sein? Kann mir das jemand erklären?
Edit: Ah, jetzt ist der Groschen gefallen. Ich dachte, da wird nach Ansi umkodiert. Anscheinen wird aber wohl nur kopiert. Edit2: Unsinn: Doch, TEncoding.Default.GetBytes wandelt nach Ansi um. |
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
Delphi-Quellcode:
durchgeführt werden.
SHA3_512UpdateXL
Mit length(Bytes) erhalte ich übrigens auch ein anderes Ergebnis für meinen Teststring. |
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
Delphi-Quellcode:
wäre hier korrekt. Je nach Encoding ist die Länge der Bytes in der Regel kürzer als die vorher berechnete Size. Demnach haben wir hier einen klassischen Buffer-Overrun, wie er bei Pointer-Programmierung leider sehr häufig vorkommt. Damit werden auch unbestimmte Bytes mit in den Hash eingerechnet, die in den TBytes gar nicht vorkommen, sondern zufällig im Speicher dahinter liegen (deshalb auch der Unterschied zwischen der Verwendung von Size und Length(Bytes)). Bei Size ist das Ergebnis daher auch nicht deterministisch.
Length(bytes)
Eine aktuelle Implementierung würde vermutlich gleich auf TBytes aufsetzen und wäre damit auf die Angabe der Puffergröße gar nicht angewiesen. |
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
|
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
Zitat:
Zitat:
|
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
Zitat:
|
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
.. oder weil die Benutzung durch neue Compiler unnötig umständlich ist? Ich habe ja nicht behauptet, daß die bestehenden Methoden durch neue ersetzt werden sollen. Vielmehr hatte ich an overloaded-Versionen für TBytes als Alternative gedacht. So diese denn unter bestimmten Compilern nicht unterstütz werden, kann man die ja durch conditional defines ausblenden. Allerdings habe ich jetzt auch keine Lust, über den Sinn oder Unsinn von alten oder anderen Compilern zu diskutieren. Insofern steht es dir natürlich frei, deine Routinen so zu gestalten wie du es für richtig hältst. |
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
Das in der Bibleothek ein Pointer und die Größe erwartet wird, ist völlig normal. Die Bibleothek soll ja ein möglichst breites Publikum ansprechend und das bedingt verschiedene Comiler und Compilerversionen. Btw. hier nun der entgültige Code, der, soweit ich das im Moment beurteilen kann, auch korrekt läuft.
Delphi-Quellcode:
if (length(trim(ftoHash)) = 0) then exit;
SHA3_512Init(fcontext); fbytes := TEncoding.GetEncoding('UTF-16').GetBytes(fToHash); fSize := TEncoding.GetEncoding('UTF-16').GetByteCount(fToHash); SHA3_512Update(fcontext,@fbytes[0],fsize); SHA3_512Final(fcontext,fdigist); fHash := Base64Str(@fdigist,sizeof(fdigist)); |
AW: SHA-3 von Wolfang Ehrhardt
Zitat:
Delphi-Quellcode:
benutzen.
SHA3_512UpdateXL
|
AW: SHA-3 von Wolfang Ehrhardt
Das ist aber doch unnötig kompliziert, oder? (auch eine Art von Code-Obfuscation)
Delphi-Quellcode:
Warum nicht gleich so?
fbytes := TEncoding.GetEncoding('UTF-16').GetBytes(fToHash);
fSize := TEncoding.GetEncoding('UTF-16').GetByteCount(fToHash);
Delphi-Quellcode:
Oder so?fbytes := TEncoding.GetEncoding('UTF-16').GetBytes(fToHash); fSize := Length(fBytes);
Delphi-Quellcode:
Wobei der ByteCount von Unicode auch wieder nur fbytes := TEncoding.Unicode.GetBytes(fToHash); fSize := Length(fBytes);
Delphi-Quellcode:
ist. TEncoding.Default ist von den aktuellen Windows-Einstellungen abhängig, also eher ungünstig. Etwas sparsamer und trotzdem allgemein gültig wäre da noch UTF8:
CharCount * SizeOf(Char)
Delphi-Quellcode:
Wenn die Hashes auch anderweitig verwendet werden, muss sowieso das Encoding bekannt gemacht werden. Sonst kann niemand was damit anfangen.fbytes := TEncoding.UTF8.GetBytes(fToHash); fSize := Length(fBytes); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:06 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