Encode to base64 String (gelöst)

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Encode to base64 String (gelöst)

Beitrag von Peter Schweizer »

Hallo Wissende,
ich will einen Base64 encoded Hash erstellen.
Obwohl ich Beispiel Daten habe (cChallenge und cHasSoll)
gelingt es mir bisher nicht auf den cHashSoll zu kommen, der mit einem EPSON-Beispielprogramm so erstellt wurde.
(meine Exe läuft mit OEM Zeichensatz)
Die Anweisung in Pseudocode für die Erstellung lautet: hash = encodeBase64(sha256(challenge + 'EPSONKEY')

Code: Alles auswählen

	cChallenge := "b6c5356d6588ac0a"
	cHashSoll := "qh2jpiWt/ZMKsA8FtuAHYFmC36o6yUgTc1dZAbIwKTw="
	
	* meine bisherige Berechnung
	c2h := Char2Hash( cChallenge + 'EPSONKEY', 256)  //Hash per SHA2-256  nBitLen=256  Len(c2h)=64
	c2h_bin := var2bin(c2h)
	cHash := bin2Base64( c2h_bin )
Kann mir da jemand auf die Sprünge helfen ?

Peter
Zuletzt geändert von Peter Schweizer am Fr, 08. Mai 2020 9:20, insgesamt 2-mal geändert.
Gruss Peter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von brandelh »

Das Epson Beispielprogramm nutzt sicher ANSI oder gar UNICODE Zeichensatz.
Der String muss also erstmal konvertiert werden vermute ich.
Gruß
Hubert
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Re: Encode to base64 String

Beitrag von Peter Schweizer »

Hubert,
wenn ich den String c2h := Oem2AnsiCP(c2h) konvertiere ändert sich nichts.
Ist den meine prinzipielle Vorgegenweise korrekt ?

Gruß Peter
Gruss Peter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von brandelh »

das spricht dafür, dass im ursprünglichen Text keine Umlaute vorkommen.

Was mich wundert ist, dass du erst einen HASH erzeugst (nach meinem Verständnis etwas, was aus einem Text eine eindeutige 7-Bit Zeichenfolge erstellt, daraus ein Base64 kodierter Text.
Das macht meiner Meinung nach keinen Sinn, da man ja Base64 kodiert um störende Zeichen zu eliminieren ... kann sein dass das richtig ist, aber ohne genaue Beschreibung der Vorgabe kann ich das nicht beurteilen.
Eventuell wäre es hilfreich die Vorgabe zu posten ;-)
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von Wolfgang Ciriack »

Ich würe es so probieren:

Code: Alles auswählen

c2h := Char2Hash( cChallenge + 'EPSONKEY', 256)
cHash := ToBase64(c2h)
Viele Grüße
Wolfgang
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Re: Encode to base64 String

Beitrag von Peter Schweizer »

Wolfgang,
dein vorschlag führt leider auch noch nicht zum Ziel.
Ich habe mir nun nochmals meine Ergebnisse mit den Ergebnissen des EpsonTSEdemo Programms verglichen.
Was mir auffällt ist, das mein cHash immer 90 Zeichen lang ist und der von EPSON immer 44 Zeichen.
Deshalb meine Vermutung, das bei der Bildung des Hashs etwas nicht paßt.

Code: Alles auswählen

EPSON Beispiel-Prg Anforderung mit Hash= 44 Zeichen
**No. of bytes sent: 380
<device_data><device_id>local_TSE</device_id><data><type>operate</type><timeout>
60000</timeout><requestdata>{"storage": {"type": "TSE","vendor" : "TSE1"},"funct
ion" : "AuthenticateUserForAdmin","input" : {"userId":"Administrator","pin":"123
45","hash":"fCft20khA4b2/g5czaUbI29iCg/lXlY4emt4IQykcY4="},"compress" : {"requir
ed": false,"type" : ""}}</requestdata></data></device_data>[0x00]

Meine Anforderung mit Hash= 90 Zeichen (Bildungsvorgabe von Wolfgang benutzt)
Zeichen zu senden:460
<device_data><device_id>local_TSE</device_id><data><type>operate</type><timeout>50000</timeout>
<requestdata>
{"storage":{"type" : "TSE","vendor" : "TSE1"},"function" : "AuthenticateUserForAdmin","input" : {"userId" : "Administrator","pin" : "12345",
"hash" : "NEVBMUJFMTFBMEZFNDkwRjdFOUJCQUNFMkMzNDk4ODJFQUU0OTYyMjE0MTdDQjUwOUZGNzc3NEQ2RDAzOEY2Qw=="},"compress":{"required" : false,"type" : ""}}</requestdata></data>
</device_data>
Hubert,
Die Bildungsvorschrift habe ich im nachfolgenden Code-Block hinterlegt.

Code: Alles auswählen

7.3.2 Login as Administrator to the TSE 
In addition to the PINs, the login process is secured by a simple challenge-response mechanism. 
First you need to request a challenge string from the Epson TSE Driver: 
Example: 
"function": "GetChallenge", "input": { 
"userId": "Administrator" }, 

The response object has a field “challenge”, which contains a 16 character long random string. 
Now concatenate the string with the shared secret, which is initially “EPSONKEY”. Then generate a SHA256 hash of the whole string and encode the binary result in base64. 
Example in pseudo code:   hash = encodeBase64(sha256(challenge + "EPSONKEY")) 

Then call the login function for Administrator: 
Example: 
"function": "AuthenticateUserForAdmin", "input": { 
"userId": "Administrator", 
"pin":"12345", 
"hash":"{base64 encoded hash}" 
}, 
Gruß Peter
Gruss Peter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von brandelh »

Die Frage ist, ob die HASH Erstellung genormt ist ...

Laut der Xbase++ 2.0 Doku hängt die Länge von der Art ab, eventuell auch von m Verschlüsselungsgrad ab

Code: Alles auswählen

Char2Hash() Convert a character string to a hash value 

Char2Hash( <cString> [, <nBitLen>] ) --> cHash
...
Depending on the optional parameter <nBitLen>, Char2Hash() selects a hash algorithm according to the following table. The length of the return value cHash depends on the selected algorithm. 
Algorithm nBitLen Length of cHash 
SHA1        160     40 
SHA2-256    256     64 
SHA3-512    512    128 
die Frage ist, ist sichergestellt dass der HASH von verschiedenen Programmiersprachen gleich umgesetzt wird ?

Keine der aufgeführten Längen passt zu deinen Ergebnissen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von brandelh »

Ich habe mal hier einen Test gemacht, direkt in der Workbench erfasst .... ANSI oder ?

// oh Schreck, ANSI ist zwar die EXE, die Einstellung verändert aber den Text !!! das ist übel ;-)

Code: Alles auswählen

Dies ist ein durchaus l„ngerer Text fr den Test  (48)
0FDED491E5796CEC84135D46917AA1B00A2C4DC4C3B1B6A7EE4B9AEEE6F377EC (64) // wie in der Hilfe angegeben erzeugt die Funktion einen String mit HEX Zahlen Werten.
// nochmal Testen, diesmal ohne Formatwandlung, sicher ANSI Text...

Code: Alles auswählen

Dies ist ein durchaus längerer Text für den Test (        48)
EC663099F2606A33BEF6CB9B24F3611B4C8F3CA47202CE39E97C91685A6C3EBD (        64)
wie erwartet ein komplett anderes Ergebnis !
Eine mögliche Fehlerquelle, hinzu kommt, dass die andere Sprache eventuell einen UTF-8 Text durch jagt

Ich denke hier ist der wichtigste Ansatz, wenn der HASH unterschiedlich ausfällt, macht es die weitere Codierung nicht besser.

Ich hab grad deinen Text gefunden oben, da spielt der Zeichensatz keine Rolle, alles im 7bit Raum:

Code: Alles auswählen

b6c5356d6588ac0aEPSONKEY (        24)
AA1DA3A625ADFD930AB00F05B6E007605982DFAA3AC9481373575901B230293C (        64)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von brandelh »

So ich habe im Netz gestöbert und die SHA256 Berechnung ist fix definiert. Im Netz habe ich einen Hashgenerator gefunden und deinen Text durchlaufen lassen:

Code: Alles auswählen

b6c5356d6588ac0aEPSONKEY (        24)
AA1DA3A625ADFD930AB00F05B6E007605982DFAA3AC9481373575901B230293C  = Xbase++ alles große Buchstaben
aa1da3a625adfd930ab00f05b6e007605982dfaa3ac9481373575901b230293c  = SHA256 online Generator alles kleine Buchstaben ... 
ich mache mal lower() rein. Und siehe da ...

Code: Alles auswählen

b6c5356d6588ac0aEPSONKEY (        24)

AA1DA3A625ADFD930AB00F05B6E007605982DFAA3AC9481373575901B230293C (Xbase++         64)
aa1da3a625adfd930ab00f05b6e007605982dfaa3ac9481373575901b230293c (lower           64)
aa1da3a625adfd930ab00f05b6e007605982dfaa3ac9481373575901b230293c (Online          64)  :arrow: => https://hashgenerator.de/
Online und Lower sind gleich !

Teste mal was bei dir raus kommt, wenn du mit kleinen Buchstaben weiter machst.
Ich suche mal im Internet nach einer base64 online Berechnung
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von brandelh »

mit dem Test hat es nicht funktioniert, aber das Ergebnis sieht zumindest ähnlicher aus ;-)

Code: Alles auswählen

QUExREEzQTYyNUFERkQ5MzBBQjAwRjA1QjZFMDA3NjA1OTgyREZBQTNBQzk0ODEzNzM1NzU5
[b]MDFCMjMwMjkzQw==[/b]  ToBase64(cHash) 

YWExZGEzYTYyNWFkZmQ5MzBhYjAwZjA1YjZlMDA3NjA1OTgyZGZhYTNhYzk0ODEzNzM1NzU5
[b]MDFiMjMwMjkzYw==[/b]  ToBase64(cHashKlein) 

[b]qh2jpiWt/ZMKsA8FtuAHYFmC36o6yUgTc1dZAbIwKTw=[/b]  gewünschtes Ergebnis laut erstem Post 
cText += ToBase64(cHash)+" ToBase64(cHash) "+chr(13)+chr(10)
cText += ToBase64(cHashKlein)+" ToBase64(cHashKlein) "+chr(13)+chr(10)
cText += cHashSoll+" gewünschtes Ergebnis laut erstem Post "+chr(13)+chr(10)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String

Beitrag von brandelh »

So hier noch der Online Test mit ...

aa1da3a625adfd930ab00f05b6e007605982dfaa3ac9481373575901b230293c => YWExZGEzYTYyNWFkZmQ5MzBhYjAwZjA1YjZlMDA3NjA1OTgyZGZhYTNhYzk0ODEzNzM1NzU5MDFiMjMwMjkzYyA=

AA1DA3A625ADFD930AB00F05B6E007605982DFAA3AC9481373575901B230293C => QUExREEzQTYyNUFERkQ5MzBBQjAwRjA1QjZFMDA3NjA1OTgyREZBQTNBQzk0ODEzNzM1NzU5MDFCMjMwMjkzQw==

https://www.base64decode.org/

hier habe ich dein gewünschtes Ergebnis eingestellt, aber kein sinnvolles Rückergebnis erhalten.
Gruß
Hubert
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Re: Encode to base64 String GELÖST

Beitrag von Peter Schweizer »

Hubert,
vielen Dank für Deine Bemühungen, die mich auf den richtigen Weg gebracht haben.
Entscheidend war Deine Gegenüberstellung des Ergebnisses
c2h := Char2Hash( scHash + 'EPSONKEY', 256)
mit
c2h := Lower( Char2Hash( scHash + 'EPSONKEY', 256))
dabei kam mir die Erkenntnis, das das Ergebnis in c2h kein Zeichen/String mit 8bit ist,
sondern ja jedes Zeichen ein Hexwert mit 4 bit darstellt.
Mit dem Befehl HexToStr(c2h) habe ich nun diesen HexString umgewandelt.
Und siehe da der Befehl cHash := ToBase64(c2h) liefert nun das erwartete Ergebnis eines Hashs mit Länge 44 Zeichen
(bei dem Epsondemo-Prg war der Hash ja immer 44 Zeichen lang).

nochmals vielen Dank
Gruß Peter
Gruss Peter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String (gelöst)

Beitrag von brandelh »

Hut ab ... aus der Beschreibung
Die Anweisung in Pseudocode für die Erstellung lautet: hash = encodeBase64(sha256(challenge + 'EPSONKEY')
wäre ich da nicht drauf gekommen.

Insbesondere, weil ja Sinn des Hash() Befehls ja ist, eine eindeutige HEX Darstellung eines x-Beliebigen Inhalts zu bekommen. HEX Ziffern sind immer gleich ...
wobei durch deine Umwandlung wäre groß oder klein auch kein Problem gewesen.
Gruß
Hubert
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Re: Encode to base64 String (gelöst)

Beitrag von Peter Schweizer »

Hubert,
ich hatte mich auch ein bischen von der xBase Doku für CharToHash() irreführen lassen,
weil dort von einem cString gesprochen wird, und ich hatte natürlich damit autom. einen 8bit -Zeichen verbunden.
*---------------------------------
RETURN: The hash value of the parameter <cString>. cHash is a character string representing a hexadecimal number.
*-------------------------------------
Gruß Peter
Gruss Peter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Encode to base64 String (gelöst)

Beitrag von brandelh »

und das ist es ja auch, denn jedes HEZ Zeichen ist ein 8 Bit char in dieser Darstellung ;-)
Man braucht 2 HEX-Zeichen für jedes verschlüsselte Zeichen.
Aber das ist die normale Darstellung, dass das im Epson Beispiel wieder zunächst in einen richtigen String zurückgewandelt werden muss, da muss man erst mal drauf kommen. =D>
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Encode to base64 String (gelöst)

Beitrag von Jan »

Danke für die Diskussion. Ich hab mich auch dumm und dusselig getestet. Bis ich den Thread hier gefunden hab.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten