Serial Key speichern?

internet

Top Contributor
Hallo zusammen,

ich habe folgendes vor:
Ich möchte eine Webapplikation samt Applikationsserver (Wildfly) und DB (h2 Database) ausliefern.

1) Beim ersten Aufruf auf die Webapp wird man erst nach dem Serial Key gefragt, den man zuvor per Email erhalten hat.
2) Der User gibt nun den Serial Key ein.
3) Es wird ein WebService angefragt (Internetverbindung vorrausgesetzt), der prüft, ob es den Serial Key schon gibt etc. Es kommt dann entweder true oder false zurück

Nun ist aber mein eigentliches Problem:
Wo speichere ich diese Information ab, also ob true oder false ?
In der Datenbank geht es schlecht, da der User aufgrund den Config-Files auch Username und Passwort hat, sodass er den Eintrag in der Datenbank selbst schreiben kann.
Denn genau diese Information (true oder false) wird beim Aufruf der Applikation geprüft:
Bei true -> normaler Aufruf und Nutzung der WebApp
Bei false -> Weiterleitung zur SerialKey - Eingabe

Hat jemand Ideen? Bin über jeden Tipp dankbar.
 
Zunächst: Du MUSST es irgendwo speichern. Wenn dein Programm an die Info kommt, dann auch der User => ergo kann der User es theoretisch auch verändern.

Nur True/False zu speichern macht deine Software super easy zu cracken.
Zum Thema Lizenzen erhalten und prüfen gibt es mehr Theorien wie Sand am Meer. Hier mein Favorit:

1. Sende den Lizenzschlüssel L an den Server. (Wenn ungültig natürlich abbrechen)
3. Der Server errechnet eine Signatur S des Schlüssels mit seinem privaten Schlüssel (S = SIG(L))
4. Der Server sendet L und S zurück
5. Du speicherst L und S in der Datenbank oder in einer Datei
Um nun zu prüfen, ob die Lizenz gültig ist, prüfst du die Signatur mit dem öffentlichen Schlüssel des Servers.

Sollte deine Anwendung immer Internetzugriff haben, kannst du auch eine ablaufzeit einbauen sodass der Schlüssel alle 2-3 Tage neu geprüft wird.
 
Danke für die Antwort.
Hast Du hierfür ggf. Codebeispiele:

3. Der Server errechnet eine Signatur S des Schlüssels mit seinem privaten Schlüssel (S = SIG(L))
4. Der Server sendet L und S zurück
5. Du speicherst L und S in der Datenbank oder in einer Datei
Um nun zu prüfen, ob die Lizenz gültig ist, prüfst du die Signatur mit dem öffentlichen Schlüssel des Servers.

Das ist mir nicht so ganz klar - wie errechne ich eine Signatur?
Was meinst Du genau mit S = SIG(L)
Wie genau sieht dann L oder S aus? Datentyp= String?

Die Applikation hat nicht immer Internetzugriff - bestmöglich wird Internetzugriff nur für den Key bzw. Freischaltung benötigt.
 
Public-Key Kryptographie im allgemeinen: https://de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem
Konkret RSA: https://de.wikipedia.org/wiki/RSA-Kryptosystem
In Java siehe (sowohl zum Signieren als auch zum prüfen): http://docs.oracle.com/javase/7/docs/api/java/security/Signature.html

Deinen Lizenzschlüssel musst du hierfür in eine Zahl umwandeln (z.B. Base36 oder Base62); die ist dann aber zu groß für int oder long, da musst du java.math.BigInteger benutzen.
Die Signatur sind dann Binärdaten; die musst du dann sinnvollerweise in einen String oder eine Zahl umwandeln (hier wäre Base64 oder Base62 zu empfehlen).

Dass deine Applikation keinen Internetzugriff hat ist in Ordnung. Du solltest dann nur aufpassen, dass man nicht 3 Installationen mit dem selben Key aktivieren kann.
 
Danke.
Den privaten Key lege ich dann auf dem Server ab?

Aber so ganz verstehe ich noch nicht was dann die Signatur mir bringt? Wie prüfe ich dann, ob der Key gültig ist. Wird das dann nochmals in meiner Webapplikation geprüft?
Wenn die Signatur z.B. 1234 ist und diese als gültig gilt, dann könnte man doch einfach in der DB diese Signatur jedes Mal verwenden? Wie kann ich es denn dann verhinden, dass der Key bzw. die Signatur nicht zig mal verwendet wird? Wie gesagt, Internetzugang soll nur für die Aktivierung des Key gelten.
Klar - mit Internetzugang könnte ich dann alle paar Stunden z.B. nochmal prüfen, ob der Key gültig ist - aber ohne Internetzugang - wie mache ich das?
 
Ja, auf dem Server.

Das geht nicht. Punkt. Du kannst auf dem Server sicherstellen, dass eine Lizenz nicht zweimal aktiviert wird. Aber das mit der DB kannst du nicht verhindern. Die Verwendung der Kryptographie macht es aber deutlich schwieriger als mit einem einfachen boolean.
 
Du kannst den key und das was du schreibst verschlüsseln wie du willst. Solange du es in Java machet kann jeder Möchtegern Hacker dein Programm in 3 Minuten dekompilen und kurz die Abfrage des keys entfernen. Was du da vorhast ist alles vergebene Liebesmühe.

Gruß

Claus
 
Du kannst den key und das was du schreibst verschlüsseln wie du willst. Solange du es in Java machet kann jeder Möchtegern Hacker dein Programm in 3 Minuten dekompilen und kurz die Abfrage des keys entfernen. Was du da vorhast ist alles vergebene Liebesmühe.

Gruß

Claus
Es gib Obfuscator. Davon abgesehen: das geht mit jeder Software, das schaffen die cracker auch bei den kompliziertesten Kopierschutzmechanismen, welche sich Firmen wie Microsoft, Adobe oder EA erstellen.

@TE: Nur auf die Internetverbindung zu prüfen bringt dir nicht viel, du musst dann auch den Lizenzschlüssel prüfen. Siehe dazu: java.io.Socket und java.net.URLConnection
 

Zurück
Oben