AGB  ·  Datenschutz  ·  Impressum  







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

DEC 5.2 String hashen?

Ein Thema von a.def · begonnen am 2. Mai 2017 · letzter Beitrag vom 7. Mai 2017
Thema geschlossen
Seite 11 von 12   « Erste     91011 12      
nahpets
(Gast)

n/a Beiträge
 
#101

AW: DEC 5.2 String hashen?

  Alt 5. Mai 2017, 22:24
Ein Hash ist kein lesbarere Text, sondern schlicht eine mehr oder weniger lange Bytefolge (landläufig als Salat bezeichnet).
 
a.def
(Gast)

n/a Beiträge
 
#102

AW: DEC 5.2 String hashen?

  Alt 5. Mai 2017, 22:36
Ich lass das jetzt einfach so. Es funktioniert was will ich denn mehr?
Ist mir jetzt ehrlich gesagt auch zu sehr ein HeckMeck den String da noch in irgendwas anderes umzuwandeln und was weiß ich noch alles.

Geändert von a.def ( 5. Mai 2017 um 22:59 Uhr)
 
Michael II

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

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 00:12
Ich bin dir wirklich sehr dankbar für alles. Aber leider funktioniert dein Code bei mir nicht.
Für folgendes erhalte ich auch nur Salat
Delphi-Quellcode:
 // _TEST_TEST_D36E844639D6B4B9ADAF9A11C2ABF841CCE43E94C57539C03CC9524545DD8E8D
 ShowMessage( TEncoding.ANSI.GetString(
    GetSHA1HashFromFile(aFileName, [0, -64])
   )
   );
Du machst einen Fehler SHA1 liefert 160Bit/20Byte Werte. Du musst also
hash := GetSHA1HashFromFile( filename, [0,-21] );
berechnen, wenn du den Hash Wert des Files ohne den angehängten (20 Byte) Hash Wert berechnen willst.

So geht's:

SHA1 ans Ende des Files schreiben durch Aufruf von
procedure SchreibeSHA1HashAnsEndeDesFiles( const filename : string );

Delphi-Quellcode:
procedure HashAnsEndeDesFilesSchreiben( filename : string; hash : TBytes );
var f : TFileStream;
begin
  f := TFileStream.Create( filename, fmOpenWrite );
 try
  f.Position := f.Size;
  f.Write( hash[0], length( hash ) );
 finally
  f.Free;
 end;
end;


procedure SchreibeSHA1HashAnsEndeDesFiles( const filename : string );
var hash, hash2 : TBytes;
begin
  hash := System.hash.THashSHA1.GetHashBytesFromFile( filename ); // Delphi system.hash
  // hash2 := GetSHA1HashFromFile( filename , [] ); // oder wir verwenden "unsere" SHA1 Funktion
  HashAnsEndeDesFilesSchreiben( filename, hash );
end;

Den Hashwert am Ende des Files überprüfen:
function PruefeSHA1HashAmEndeDesFiles( const filename : string ) : boolean;


Delphi-Quellcode:
function LiesHashAmEndeDesFiles( const filename : string; len : integer ) : TBytes;
var f : TFileStream;
begin
  f := TFileStream.Create( filename, fmOpenRead );
 try
  f.Position := f.Size - len ;
  SetLength( Result, len );
  f.Read( Result, len );
 finally
  f.Free;
 end;
end;

function PruefeSHA1HashAmEndeDesFiles( const filename : string ) : boolean;
var hashAmFileEnde, hash : TBytes;
begin
  hash := GetSHA1HashFromFile( filename, [0,-21] ); // SHA1 erzeugt 160bit (20Byte) Werte
  hashAmFileEnde := LiesHashAmEndeDesFiles( filename, 20 );
  Result := CompareMem( hash, hashAmFileEnde, 20 );
end;


Testen:

Delphi-Quellcode:
procedure pruefen_SHA1;
var filename : string;
    allesok : boolean;
begin
  filename := 'C:\Users\Michael\Desktop\1GB.txt';

  // Ans Fileende schreiben:
  SchreibeSHA1HashAnsEndeDesFiles( filename );
  // Prüfen, ob der HashWert OK ist:
  allesok := PruefeSHA1HashAmEndeDesFiles( filename );

  ShowMessage( 'Check File : ' + allesok.ToInteger.ToString );
end;
Michael Gasser
 
a.def
(Gast)

n/a Beiträge
 
#104

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 00:45
Ganz dumme Frage:

wenn ich den String-Hash direkt speichere und er sagen wir mal 64 Byte lang ist, wieviele Byte nimmt denn sein Äquivalent der "Salat" ein. Ebenefalls exakt 64 Byte?
Weil im Editor sieht das irgendwie kürzer aus.
 
Michael II

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

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 00:47
Ich lass das jetzt einfach so. Es funktioniert was will ich denn mehr?
Ist mir jetzt ehrlich gesagt auch zu sehr ein HeckMeck den String da noch in irgendwas anderes umzuwandeln und was weiß ich noch alles.
Es ist gerade umgekehrt. SHA1 liefert 20 Bytes und diese 20 Bytes werden dann typischerweise (wenn du den Wert in irgend einer Arbeit o.ä. druckst) als hex Wert dargestellt.

Wenn du dir also deine Bytes lieber hex anschaust, dann wandle sie doch einfach um:

Delphi-Quellcode:
function TBytesToHex( b : TBytes ) : RawByteString;
var i : integer;
begin
  Result := '';
  for i := 0 to length(b)-1 do Result := Result + inttohex(b[i]);
  Result := lowercase(Result);
end;
Michael Gasser
 
a.def
(Gast)

n/a Beiträge
 
#106

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 00:50
Ob SHA1 2 MD5 ist doch egal. Ging mir nur darum, ob da auch 64 Bytes landen, wenn der Hash in der lesbaren Version auch 64 Bytes lang ist. Verstehe halt noch nicht wie "lang" der Salat wirklich ist weil der manchmal kürzer, manchmal länger aussieht als die lesbare Version
 
Michael II

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

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 01:11
Ganz dumme Frage:

wenn ich den String-Hash direkt speichere und er sagen wir mal 64 Byte lang ist, wieviele Byte nimmt denn sein Äquivalent der "Salat" ein. Ebenefalls exakt 64 Byte?
Weil im Editor sieht das irgendwie kürzer aus.

Ich glaube du bezeichnest den "Byte Array" als Salat:

Salat:
(212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126)

hex
'd41d8cd98f00b204e9800998ecf8427e'

In einem Byte kannst du die binären Werte 00000000..11111111 speichern, dezimal geschrieben die Werte von 0..255 [dein Salat] und hex 00 bis ff [deine Strings].

212 ist hex d4
29 ist hex 1d
140 ist hex 8c
usw.

16 Bytes Salat ergeben also einen 32 stelligen String.

https://de.wikipedia.org/wiki/Hexadezimalsystem
Michael Gasser
 
a.def
(Gast)

n/a Beiträge
 
#108

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 01:22
Mh Ok ich verstehe. Das heißt Bytes Array ist immer von der Länge her die Hälfte vom Hex.
Ich gucke morgen nochmal rein und gucke, ob ich was ändern kann.

Kann ich dafür TByteStream behalten oder ist TFileStream ein Muss?
 
Benutzerbild von himitsu
himitsu

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

AW: DEC 5.2 String hashen?

  Alt 6. Mai 2017, 11:27
Und ein Salt kann natürlich beliebig groß sein, außer bei Hash-/Verschlüsselungsfunktionen, die einen Salt mit fester Länge erfordern.
Ein Salt ist einfach nur ein "beliebiger" Startwert, mit dem man quasi den Hash initialisiert, damit bei selben Eingangsstrings nicht der selbe Ausgangshash raus kommt, also z.B. das selbe Passwort in verschiedenen Systemen nicht den selben Hash hat und man es so auch mit Rückrechnen/Rainbowtables nicht so leicht hat, um ein passendes Equivalent zu finden.

Wordpress z.B. nutzt einen von der Database separat gespeicherten globalen Salt, für alle Passwörter.
Alternativ kann man auch zu jedem Hash einen eigenen Salt generieren und beim/im Hash hinterlegen.

Wenn du dir also deine Bytes lieber hex anschaust, dann wandle sie doch einfach um:
Delphi-Quellcode:
function TBytesToHex( b : TBytes ) : RawByteString;
var i : integer;
begin
  Result := '';
  for i := 0 to length(b)-1 do Result := Result + inttohex(b[i]);
  Result := lowercase(Result);
end;
BinToHex?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 6. Mai 2017 um 11:30 Uhr)
 
Michael II

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

AW: DEC 5.2 String hashen?

  Alt 7. Mai 2017, 12:06
Mh Ok ich verstehe. Das heißt Bytes Array ist immer von der Länge her die Hälfte vom Hex.
Ich gucke morgen nochmal rein und gucke, ob ich was ändern kann.

Kann ich dafür TByteStream behalten oder ist TFileStream ein Muss?
Wenn du den in einem Byte gespeicherten Wert im hex System interpretieren und als Zeichenkette speichern willst, dann benötigst du pro Byte 2 Zeichen (aus {0..9,A..B} ).

Wenn du den in einem Byte gespeicherten Wert im binären System interpretieren und als Zeichenkette speichern willst, dann benötigst du pro Byte 8 Zeichen ( aus {0..1} ).


TBytesStream oder TFileStream?
(siehe auch weiter oben)
Du willst mit Daten, welche in einem File enthalten sind arbeiten.
TBytesStream kann Daten aufnehmen, welche als Bytes interpretiert werden. Via LoadFromFile kannst du die Daten aufnehmen, welche in einem File enthalten sind.
TFileStream kann keine Daten aufnehmen, sondern gibt dir nur die Möglichkeit (via read/write/..) auf die Daten eines Files zuzugreifen. (Der Datenspeicher ist also hier quasi deine Festplatte o.ä..)

Da du für die Berechnung von SHA1, MD5 Hashs nicht alle Daten (Filedaten) aufs Mal benötigst, musst du auch nicht alle aufs Mal einlesen.

Nimm wie in den Meldungen weiter oben erwähnt TFileStream. Dann hast du deine Daten auf der Platte und liest jeweils nur soviel Daten ein, wie du gerade benötigst.


Und noch kurz zu der Verwendung von trim(..) in deinem Code.
Wenn du für eine beliebige Datei einen Hash Wert berechnen willst, dann darfst du trim nicht verwenden.

Delphi-Quellcode:
daten : TBytes;
a1 : ansistring;
...
...
a1 := trim( TEncoding.ANSI.GetString( daten ) );
Falls zum Beispiel daten[0] den Wert 32 enthält, dann entspricht dies nach TEncoding.ANSI.GetString dem Leerzeichen und mit trim(..) schneidest du dieses Leerzeichen ab. Wenn du nun über a1 "hashst", dann ermittelst du somit nicht den Hash von daten. [Wenn du TFileStream verwenden wirst und deine exe stückweise einliest (und jeweils die Hash Update Methode aufrufst), dann denk daran: Nicht trimmen .]

Und wenn du's nicht selbst schreiben willst: Du kannst ja 1:1 den weiter oben geposteten Code verwenden fürs Schreiben und Checken des SHA1/MD5 Hashs.

Ich glaube, du hast nun alles, was du benötigst. Ich habe längst fertig .
Michael Gasser
 
Thema geschlossen
Seite 11 von 12   « Erste     91011 12      


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 22:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz