Signature String umwandeln

Mr. Smith

Lt. Commander
Registriert
Mai 2010
Beiträge
1.610
Hallo zusammen,

diese Anfrage ist etwas spezieller und ich hoffe, dass mir hierbei jemand behilflich sein kann.
Ohne unnötig ins Detail zu gehen: Es muss ein SignatureString auf eine gewisse Art und Weise aufbereitet werden, um daraus am Ende einen für mich verwertbaren QR-Code erzeugen zu können.

Momentan mache ich das mehr oder weniger von Hand und das ist sehr mühsam.
Ziel wäre am Ende eine Batch-File o.ä. zu haben, die mir die Arbeit zumindest zum Teil abnehmen kann.
Als Beispiel bekomme ich folgende Textsequenz per Mail als *.txt o.ä. rein:

eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMl8xMjM0NTZfNTFfMjAxOC0wMS0wM1QxNTo0NjoxN18wLDAwXzAsMDBfMCwwMF8wLDAwXzAsMDBfTWE5eXZ4cFVkcDQ9XzAxRTJFNDZERjQyOEVBRTQ2QUNDQjEyOTU4X3JBZW8zUTFkdzVRPQ.imjuZePqAY07MYcIuw8lQbOWOM5cNUNxQM_iAv60mglD_Ysf08HYBCOn4vC8ISaXkgamKgGic-PIy9-LpDvs3g

Diese Signatur besteht grundsätzlich aus drei Teilen (getrennt durch Punkte):
eyJhbGciOiJFUzI1NiJ9.X1IxLUFUMl8xMjM0NTZfNTFfMjAxOC0wMS0wM1QxNTo0NjoxN18wLDAwXzAsMDBfMCwwMF8wLDAwXzAsMDBfTWE5eXZ4cFVkcDQ9XzAxRTJFNDZERjQyOEVBRTQ2QUNDQjEyOTU4X3JBZW8zUTFkdzVRPQ.imjuZePqAY07MYcIuw8lQbOWOM5cNUNxQM_iAv60mglD_Ysf08HYBCOn4vC8ISaXkgamKgGic-PIy9-LpDvs3g

Der erste Teil (rot) sieht immer gleich aus und sollte aus der Sequenz automatisch entfernt werden (inkl. des Punktes), sodass folgendes verbleibt:
X1IxLUFUMl8xMjM0NTZfNTFfMjAxOC0wMS0wM1QxNTo0NjoxN18wLDAwXzAsMDBfMCwwMF8wLDAwXzAsMDBfTWE5eXZ4cFVkcDQ9XzAxRTJFNDZERjQyOEVBRTQ2QUNDQjEyOTU4X3JBZW8zUTFkdzVRPQ.imjuZePqAY07MYcIuw8lQbOWOM5cNUNxQM_iAv60mglD_Ysf08HYBCOn4vC8ISaXkgamKgGic-PIy9-LpDvs3g

Beim blauen Part handelt es sich um eine Base64-URL die in einen normalen String konvertiert werden muss.
Dies erledigt z.B. 'https://www.base64decode.org/' So wird aus dem blauen Part (wieder ohne Punkt) letztlich:

_R1-AT2_123456_51_2018-01-03T15:46:17_0,00_0,00_0,00_0,00_0,00_Ma9yvxpUdp4=_01E2E46DF428EAE46ACCB12958_rAeo3Q1dw5Q=

Der letzte Teil (orange) muss ebenfalls umgewandelt werden (von Base64-URL auf Base64) und zusätzlich muss die Länge des Datensatzes am Ende durch 4 teilbar sein. Dies mache ich aktuell ebenfalls von Hand. Hier genügt eine einfache Zeichenersetzung.
Im Grunde muss man nur aus jedem "_" ein "/" machen und aus jedem "-" wird ein "+".
Am Ende also aus:
imjuZePqAY07MYcIuw8lQbOWOM5cNUNxQM_iAv60mglD_Ysf08HYBCOn4vC8ISaXkgamKgGic-PIy9-LpDvs3g
das:
imjuZePqAY07MYcIuw8lQbOWOM5cNUNxQM/iAv60mglD/Ysf08HYBCOn4vC8ISaXkgamKgGic+PIy9+LpDvs3g

Diese Sequenz hat aktuell 86 Ziehen und soll am Ende durch 4 teilbar sein.
Die 2 fehlenden Zeichen müssen am Ende mit "=" aufgefüllt werden. Also:
imjuZePqAY07MYcIuw8lQbOWOM5cNUNxQM/iAv60mglD/Ysf08HYBCOn4vC8ISaXkgamKgGic+PIy9+LpDvs3g==

Der Datensatz kann aber in seiner Ausgangsform auch mal 82 Zeichen haben und muss dann auf 84 Zeichen ergänzt werden oder auch mal von 91 auf 92 Zeichen. Die Länge ist leider variabel.

Beide Teile werden dann am Ende zusammenkopiert und durch "_" voneinander getrennt:

R1-AT2_123456_51_2018-01-03T15:46:17_0,00_0,00_0,00_0,00_0,00_Ma9yvxpUdp4=01E2E46DF428EAE46ACCB12958_rAeo3Q1dw5Q=_imjuZePqAY07MYcIuw8lQbOWOM5cNUNxQM/iAv60mglD/Ysf08HYBCOn4vC8ISaXkgamKgGic+PIy9+LpDvs3g==

Abschließend erzeuge ich daraus einen QR-Code mit einem beliebigen QR-Code Generator.

779532


Die Frage ist jetzt ob bzw. in wie weit sich das automatisieren lässt.
Wenn ich am Ende einen String erhalten würde, den ich nur noch in einen QR-Code Generator schmeissen muss, wäre das extrem hilfreich. Allerdings verfüge ich selbst nicht über die nötigen Kenntnisse, das zu realisieren. Any ideas?
 
Zuletzt bearbeitet:
ja, das problem lässt sich lösen, allerdings nicht ohne programmieren, ein bisschen python o.Ä. zosammenkompieren müsstest du schon ;-)
 
  • Gefällt mir
Reaktionen: Mr. Smith
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Mr. Smith
Das sieht doch sehr nach einem JWT / JSON Web Token aus?
 
  • Gefällt mir
Reaktionen: Mr. Smith
Kanibal schrieb:
Das sieht doch sehr nach einem JWT / JSON Web Token aus?

Das ist es, ja.

umask007 schrieb:

Genau sowas habe ich gesucht. Allerherzlichsten Dank :schluck: :jumpin:
Das spart eine Menge Arbeit und ich bin in programmier-technischer Sicht leider absolut unfähig ^^

Allerdings noch eine weitere Frage eines Vollnoobs auf diesem Gebiet:
Lässt sich sowas z.B. in eine *.exe packen, damit ich sowas auch mal einem Kollegen mit auf den Weg geben kann oder alternativ eine URL, die einfach nur die String abfragt?

Ich weiß, das sind dumme Fragen; aber ich komme halt aus der Hardware-Ecke
und habe damit üblicherweise nichts zu tun. #shame
 
Das lässt sich in eine eigene HTML-Seite packen und kann dann mit dem Browser ausgeführt werden:

HTML:
<html>
  <head>
      <style>
       #tbSignatureText
       {
        width: 90%;
       }
      </style>
      <script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
      <script>
 function b64_to_utf8(str) {
   return decodeURIComponent(escape(window.atob(str)));
 }
 //https://stackoverflow.com/questions/5234581/base64url-decoding-via-javascript
 function decodeBase64Url(input) {
   // Replace non-url compatible chars with base64 standard chars
   input = input
     .replace(/-/g, '+')
     .replace(/_/g, '/');

   // Pad out with standard base64 required padding characters
   var pad = input.length % 4;
   if (pad) {
     if (pad === 1) {
       throw new Error('InvalidLengthError: Input base64url string is the wrong length to determine padding');
     }
     input += new Array(5 - pad).join('=');
   }

   return input;
 }
 $(function() {
    $('#btnSignatureTextOk').click(function() {
       var inputText = $("#tbSignatureText").val();
       var parts = inputText.split(".");
       var part1 = b64_to_utf8(parts[1]);
       var part2 = decodeBase64Url(parts[2]);
       var result = part1 + '_' + part2;
       $('#result').text(result);
   });
 });
      </script>
  </head>
  <body>
    <p>
      Signature string:
    </p>
    <div>
      <input id="tbSignatureText" type="text"/>
      <button id="btnSignatureTextOk">OK</button>
    </div>
    <div id='result'>
    </div>
  </body>
</html>

Kann sein dass es nur mit Internetverbindung läuft.
In dem Fall hilft es, die Bibliothek Jquery, die verwendet wird, offline einzubinden:

https://stackoverflow.com/questions...h-jquery-when-there-is-no-internet-connection
 
  • Gefällt mir
Reaktionen: Mr. Smith
Ist eingebunden und macht genau was es soll... Danke nochmals :daumen:
 
Freut mich, dass es dir gefällt.
Mir ist gestern noch aufgefallen, dass wenn sich am Ende des Eingabewerts ein Leerzeichen befindet,
das Ergebnis falsch ist.
Hier noch eine Verbesserung:

var parts = inputText.trim().split(".");

Eine Fehlerbehandlung fehlt auch noch...
Wenn das Eingabe Format wie beschrieben ist, sollten keine Fehler auftreten.
 
Zurück
Oben