Seite 1 von 1

SHAFingerPrint und Unicode

Verfasst: 10.09.2014 14:55
von ThoPie
Hallo zusammen,

ich bin gerade dabei mein Programm auf UniCode zu testen bzw. umzustellen. In meinem Programm wird ein FingerPrint des Passwortes in ASCII gespeichert. Bei der Umstellung bin ich auf ein Problem gestoßen. Sollten die folgenden beiden Debug-Ausgaben nicht identisch sein oder habe ich bei der Umsetzung etwas falsch gemacht.

Vielen Dank für eure Hilfe.

Code: Alles auswählen

Declare.s SHA1FingerprintAscii(T.s)
Global.s PWT
PWT="hundkatzemaus"
Debug SHA1FingerprintAscii(PWT)
Debug SHA1Fingerprint(@PWT,StringByteLength(PWT))

Procedure.s SHA1FingerprintAscii(T.s)
  Protected.i *Puffer
  Protected.s SHA
  ; SHA - SHA-Fingerprint
  *Puffer=AllocateMemory(40)
  PokeS(*Puffer,T,40,#PB_Ascii)
  SHA=SHA1Fingerprint(*Puffer,MemorySize(*Puffer))
  FreeMemory(*Puffer)
  ProcedureReturn SHA
EndProcedure

Re: SHAFingerPrint und Unicode

Verfasst: 10.09.2014 15:08
von _JON_
Der erste Hash ist von einem Unicode String und der Zweite von einem Ascii, somit sollten sie nicht identisch sein.

Das mit der Länge sollteste noch anpassen. Wie wäre es hiermit

Code: Alles auswählen

Procedure.s SHA1FingerprintAscii(T.s)
  Protected *Puffer, SHA.s, ilen
  
  ilen = Len(T)
  If Not ilen : ProcedureReturn "" : EndIf
  
  *Puffer = AllocateMemory(ilen)
  PokeS(*Puffer,T,ilen,#PB_Ascii)
  SHA=SHA1Fingerprint(*Puffer,MemorySize(*Puffer))
  FreeMemory(*Puffer)
  ProcedureReturn SHA
EndProcedure

Re: SHAFingerPrint und Unicode

Verfasst: 10.09.2014 15:24
von STARGÅTE
Hier noch mal ein paar Hintergrundinformationen:

Prüfsummen bzw. Fingerprints sind Byte-basierende algorythmen.
Eine Zeichenkette wird hingegen in Characters gespeichert.
Im Ascii-Modus ist ein Character = einem Byte.
Bei Unicode hingegen, nimmt ein Zeichen immer 2 Bytes ein.
Bei UTF8, ist es sogar so, dass es auf den Buchstaben ankommt, wie viele Bytes er nutzt.

Wenn du unabhängig von Ascii/Unicode kompilierten EXEs sein möchtest, solltest du alle Codes wie:
@String unterlassen, da der String ja je nach Modus eine andere Byte-Sequenz hat.
Stattdessen, wie du es in deiner eigene Prozedur gemacht hast, den String erst in einem von dir definierten Format in den Speicher schreiben, damit die Byte-Sequenz immer die gleiche ist.

Hier mal meine Version von SHA1 (Kompilermodus unabhängig):

Code: Alles auswählen

Procedure.s SHA1(String.s, Flags.i=#PB_UTF8)
  
  Protected Length.i = StringByteLength(String, Flags)
  Protected *Buffer  = AllocateMemory(Length)
  Protected Result.s
  
  PokeS(*Buffer, String, #PB_Default, Flags|#PB_String_NoZero)
  Result = SHA1Fingerprint(*Buffer, Length)
  FreeMemory(*Buffer)
  
  ProcedureReturn Result
  
EndProcedure


Debug SHA1("Äpfel", #PB_Ascii)
Debug SHA1("Äpfel", #PB_UTF8)
Debug SHA1("Äpfel", #PB_Unicode)
Schön zu sehen, dass je nach Stringformat der Hash ein anderer ist, aber eben immer der gleiche egal ob man die EXE in Ascii oder Unicode kompiliert. Man muss sich halt entscheiden, was nötig ist, wenn die Passwörter auch griechische Zeichen oder so haben sollen, wäre Ascii natürlich schlecht.

Re: SHAFingerPrint und Unicode

Verfasst: 10.09.2014 15:28
von ts-soft
StringByteLen() ist dabei natürlich verkehrt, da ansonsten 2 verschiedene lange Strings verglichen werden.

Re: SHAFingerPrint und Unicode

Verfasst: 10.09.2014 22:30
von Bisonte
ts-soft hat geschrieben:StringByteLen() ist dabei natürlich verkehrt, da ansonsten 2 verschiedene lange Strings verglichen werden.
Wieso sollte das verkehrt sein ?

Es wird doch das Format mit angegeben. Somit muss man bei dem Vergleich auch das Format angeben, damit es wieder passt .... oder würfel ich da schon wieder was durcheinander ?

Re: SHAFingerPrint und Unicode

Verfasst: 10.09.2014 22:43
von ts-soft
Bei dem Beispiel von ThoPie, nicht bei STARGÅTE Beispiel!

Das gab es zur Zeit meines Postings noch nicht so wirklich :lol:

Re: SHAFingerPrint und Unicode

Verfasst: 10.09.2014 22:48
von Bisonte
ts-soft hat geschrieben:Bei dem Beispiel von ThoPie, nicht bei STARGÅTE Beispiel!

Das gab es zur Zeit meines Postings noch nicht so wirklich :lol:
Achso... Allerdings mach ich mir Sorgen, wenn du für diesen Satz schon 4 Minuten brauchst :lol:

Re: SHAFingerPrint und Unicode

Verfasst: 11.09.2014 11:00
von ThoPie
Vielen Dank euch Allen.