Code für Bezahlsystem (auch bei Offline Aktivität)

internet

Top Contributor
Hallo,

Ich versuche gerade einen Weg zu finden, wie ich ein Bezahlsystem nutzen könnte.

Die Idee ist wie folgt:
  • Ich vermiete ein Gerät, das bpsw. eine Uhrzeit von 12:00 - 14:00 Uhr genutzt werden darf. Darauf wird eine Java Software betrieben.
  • Falls man das Gerät danach nutzen möchte, dann muss mich sich einen Code kaufen.

Den Code könnte man sich dann von einer Webseite erkaufen. Der Code wird dann später in der GUI vom Gerät eingegeben und die Nutzung kann weiter erfolgen.
Soweit sollte das alles funktionieren....

Nun ist das Gerät aber nicht ständig am Internet angeschlossen, sodass ich keine Online Validierung für den erkauften Code gegen einen Webservice etc. machen könnte.
Ich bräuchte bspw. einen Algorhtymus für den erkauften Code, der nur bestimmte Zahlen / Buchenstaben Kombinationen zulässt, sodass der Code valide ist.
Das sollte auch irgendwie klappen.

Problem ist nun aber, wenn der Code mehrmals genutzt wird, könnte man diesen mehrmals verwenden.
Das könnte man auch umgehen, wenn der genutzte Code in der Datenbank des Geräts gespeichert wird. Problem ist nur, wenn man mehrere Geräte hätte, dann würden diese nicht synchronisiert werden und man könnte bspw. den Code aus der Vergangenheit wieder nutzen.

Hat jemand vielleicht eine Idee?
 
Also zunaechst ist die einfachste, und sicherste Variante, ist eine asymmetrische Schluesselverfahren wo du etwas mit dem einen Schluessel signierst, und dann in deiner Software mit dem zweiten Schluessel verifizierst.

Vielleicht ist das verkaufen von "Zeitfenstern" hier die Loesung. Der Benutzer kauft sich ein das Zeitfenster "08.08.2022 14:00-18:00" und bekommt einen Code nur fuer dieses Zeitfenster.
 
Genau, das will ich ja realisieren mit dem Zeitfenster....
Das Problem ist eben bzgl. dem Code und keine Onlinevalidierung...

Ja, das mit dem asymmetrischen Schlüsselverfahren war so meine Idee.
Das garantiert aber nicht, dass der Code nicht mehrmals verwendet werden darf (da ich bei der Eingabe des Codes am Gerät eben keine Validierung gegen einen Webservice etc. machen kann, der mir nachschaut, ob der Code bereits verwendet wurde).
 
Du kannst den Geräten ja direkt eine eindeutige id geben, die dann mit angegeben werden muss und das dann mit verschlüsselt wird.

Dann hast Du eine UUID des Gerätes + ein Zeitfenster.

Aber da musst Du ggf. auch aufpassen: Kann die Zeit verändert werden? Wenn der Benutzer die Zeit verändern kann, dann könnte er die Uhrzeit immer auf den Startpunkt stellen um dann neu zu starten.

Also könnte man dann immer die Zeitpunkte protokollieren - und dann halt abbrechen, wenn er feststellt, dass die aktuelle Zeit vor der letzten Nutzung war. Aber das ist auch alles nichts sicheres, so der Nutzer vollen Zugriff auf das Gerät hat.
 
Also vielleicht noch ein paar weitere Anforderungen:
- der Code soll aller höchstens 10 Zeichen haben, denn dieser muss vom User dann am Gerät eingegeben werden

Das System, bei dem der Code gekauft wird ist theoretisch für jegliches Gerät, demnach möchte ich hier auch nicht das Gerät mit eingeben wollen.

Was ich mir vorstellen könnte:
  • Firma (welche die Geräte verleiht) hat eine Unterseite auf seiner Webseite: www.code.mycompany.com
  • Dort gibt es ein Formular mit der Eingabe von: Geräte ID, Anzahl Stunden
  • Nutzer muss auf diese Webseite gehen und muss dann hier eine Geräte ID eingeben. Die Geräte ID steht für den Endkunden dann auf dem Bildschirm + eben die Infos auf welche Webseite er gehen muss
  • Das Formular wird dann an die "globale Webseite" gesendet. Bezahlprozess geht los, User bezahlt und erhät dann den Code (per Email etc. zurück).

Dann ist die Frage nun aber, wie ich aus dem Code von ABCD12345 nun die Infos bekomme:
  • Zeitraum
  • GeräteID
 
Also was für ein Gerät ist es denn?

Ich sehe sehr viele Möglichkeiten, wie man hier etwas machen könnte. Du hast ja irgend eine Art von Computer im Gerät. Also könnte man da evtl.:
  • eine Kamera haben -> QR Codes scannen
  • per Bluetooth eine Kommunikation mit einem Smartphone haben. (Bluetooth Smart / Bluetooth Low Energy wären da z.B. Stichworte) Da kann man also ohne Pairing eine gewisse Kommunikation stattfinden lassen. Dies findet sich ja auch schon in vielen Apps (Corona Warnapp wäre ein Beispiel aber ich kenne es auch von anderen Applikationen. Eine Art Magic Login bei Apple TV Apps - App auf dem Handy ist offen, Apple TV App erwartet eine Anmeldung, man drückt nur auf "Magic Login" auf dem Smartphone und schon ist das AppleTV angemeldet. Das dürfte auch so per Bluetooth gegangen sein. Und der Datenaustausch dürfte auch ähnlich gehen - Ich habe eine Adresse oder Bild und teile es mit einem anderen Smartphone in der Nähe.)
  • Worst Case: WLAN - das halte ich aber für zu umständlich für Anwender.

Aber dann wäre der Usecase so:
  • Mit dem Smartphone in der App einen QR Code scannen oder Gerätedaten per Bluetooth bekommen.
  • Auf dem Smartphone dann den Kauf tätigen oder Details des Kaufs per QR-Code einscannen -> Keine Beschränkung auf 10 Zeichen!
  • Dann übermittelt das Smartphone die Daten an das Gerät -> Wieder keine Beschränkung auf 10 Zeichen

Aber ist das alles nicht zu komplex gedacht? Was ist das Problem, an dem Gerät den Kauf online zu validieren? Dabei ist es dann egal, ob man
a) das per WLAN koppelt. (Wenn das Gerät ein Display hat, dann kann man verfügbare WLANs anzeigen und so.)
b) das per Bluetooth und einer App auf dem Smartphone macht (Benötigt dann aber Android und iOS Applikationen)



Und was mein erster Gedanke bei sowas wäre: Wenn es um hochwertige Geräte geht und entsprechend das "mieten" auch teuer ist: Es gibt entsprechende IoT Anbindungen. Die kosten pro Gerät nicht viel und Du hast dann eigentlich überall über das Mobilfunknetz eine langsame Anbindung. Dann hast du keine Probleme mit dem Kauf und der Validierung. Dann kann man irgendwie, irgendwo kaufen und das kann man dann übermitteln. Das wäre aus meiner Sicht das, was ich am ehesten überlegen würde. Die anderen Ideen wären dann nur eine Art Fallback mit der Anwender "gequält" werden, wenn es aus irgend einem Grund nicht geht.
 
Die spannende Frage ist - kaufe ich einfach "2 Stunden" oder kaufe ich 2 Stunden von 8 bis 10 Uhr am 9.8.2022?

Wenn es nicht für einen fixen Zeitraum ist, wird es deutlich schwerer, wenn die Geräte kein garantiertes Internet haben.

10 Zeichen, ah 36 verschiedene Zeichen (0-9A-Z) entspricht 51 Bit Informationen. Das ist nicht gerade viel, was du zur Verfügung hast.

Was ist denn das Threat-Model? Wo vor willst du dich schützen und welche Risiken nimmst du in Kauf.

Das was klar ist, ich soll einen Code für 2 Stunden nicht einfach 2x eingeben können.
Ist es ein Risiko, das jemand Reverse Engineering betreibt und seinen eigenen Code-Generator schreibt?
Ist es ein Risiko, dass jemand die Java-Anwendung patcht und den Nutzungscheck ausbaut?
etc.

Müssen die Geräte alle X-Tage ans Internet? Wäre es akzeptabel da auf Lizenzverletzungen aufmerksam zu werden und Nachforderungen zu stellen?

Mal als Idee, wir haben 51 Bit.

Wir brauchen folgende Informationen:
  • Gerätenummer (16 Bit)
  • Gekaufte Dauer (4 Bit => Maximal 16 Stunden auf einmal kaufbar)
  • Laufende Nummer (um verschiedene Codes zu unterscheiden, 16 Bit)
Bleiben noch 15 Bits für die Signatur.

Das heißt du müsstest mit einem Privaten Key diese 36 Bit signieren, so dass eine 15 Bit Signatur rauskommt.
Das Gerät kann diese 36 Bit lesen und mit dem Public Key prüfen, ob die Signatur gültig ist und dann den Code akzeptieren und als verbraucht markieren in seiner internen DB.

Auf dem Server muss man nur sicherstellen, dass man die laufende Nummer pro Gerätenummer verwaltet und nicht 2x verwendet.
 
Also was für ein Gerät ist es denn?
Geht um Fotoapparaten - also ein Computer mit einem Foto drin... Der Computer wird also ständig an anderen Orten verwendet, sodass nicht immer eine Internetverbindung möglich ist - daher das Problem mit keiner Internetconnection.
Was ist denn das Threat-Model?
Was meinst du damit genau?

Das was klar ist, ich soll einen Code für 2 Stunden nicht einfach 2x eingeben können.
Ist es ein Risiko, das jemand Reverse Engineering betreibt und seinen eigenen Code-Generator schreibt?
Ist es ein Risiko, dass jemand die Java-Anwendung patcht und den Nutzungscheck ausbaut?
etc.
Kann natürlich sein, aber macht durchaus kein Sinn, da der Endkunde i.d.R. die Software nicht hat.
Ich bräuchte aber einen private Key pro "Anbieter".

"Anbieter = derjenige, der das Gerät verleiht"
"Endkunde = derjenige, der ein Foto etc. macht"

Der Vorschlag mit dem QR Code gefällt mir.
Endkunde scannt der QR Code, kauf sich einen Code. Bekommt einen QR Code zurück, hält diesen an den Fotoapparat und wird dann wieder freigeschaltet.

Ich könnte mir es so vorstellen:
- Anbieter kauft sich eine Lizenz.
Dabei wird eine UniqueID für das Gerät ermittelt (Motherboard, Mac Adresse bspw.). Zusätzlich wird ein private Key erstellt, der zum einen auf der Server - Applikation, als auch auf der Software, die auf dem Gerät läuft gespeichert wird.

Ich sehe folgende Informationen, die über den Code abrufbar sein sollen.
Diese Informationen müsste ich dann irgendwie über den Code beziehen:
  • Zeitabhängig - Nutzung für weitere 30 Minuten möglich
  • GeräteID
  • Anzahl an Fotosequenzen (anstatt zeitabhängig)

Nun hierzu ein paar Fragen:
1) Wie mache ich das mit dem Code, der mit dann diese Infos zurückgibt, die ich dann entsprechend auslesen kann?
2) Wie mache ich as mit dem UniqueID für das Gerät. Passt dafür diese Lib? https://github.com/MatthewKing/DeviceId
 

Zurück
Oben