# Java-Programm lizensieren



## FelixBaum (24. Mai 2016)

Hallo zusammen,

ich habe ein kleines Programm geschrieben und will das jetzt zu Testzwecken lizensieren. Das heißt, dass sich Leute bei mir eine Lizenz abholen müssen, um das Programm zu nutzen.
Jetzt bin ich auf license3j gestoßen und finde es sehr nützlich: Ich hatte vor, das auch an die Mac-Adresse zu binden, sodass man die Lizenz nicht einfach weitervergeben kann.

Oder reicht das, wenn ich mit RSA einfach eine Lizenzdatei verschlüssel und dann den Public-Key einfach mitliefere?

Was meint ihr dazu?


----------



## Kababär (24. Mai 2016)

Prinzipiell, aus Testzwecken, sollte es reichen, Codes zu generieren, die du in deiner Datenbank speicherst und verschlüsselt pro Lizenz mit raus gibst. Verwaltung a la "Wie viele Nutzer pro Programm" etc kann in der Datenbank ebenfalls abgespeichert werden.

MAC-Adresse finde ich persönlich eine schlechte Idee. Leichter könnte man eine solche Lizenz nicht umgehen, denn man kann seine MAC-Adresse auslesen und auch ändern, heißt ich könnte jedem meine MAC-Adresse geben, der das Programm ebenfalls nutzen möchte.

edit: Es gibt mehrere Wege: Soll der Benutzer nur einen Code eingeben zum aktivieren des Programms? Dann könnte der oben genannte Vorschlag interessant sein.
Oder wird dem Verbraucher eine Lizenzdatei zugeschickt wenn er eine Lizenz kauft? Dann würde ich eine RSA-verschlüsselte Lizenzdatei an ihn schicken, die er einbinden kann. Das Programm muss natürlich wissen, wie es gültige Lizenzen erkennt und sollte Rückmeldung geben.


----------



## FelixBaum (24. Mai 2016)

Danke für die Antwort!

Ja, das mit den generierten Codes wäre auch eine Möglichkeit.

Nein, das ganze sollte halbautomatisch ablaufen a la "Hier ist die Lizenzdatei, pack sie einfach in den Ordner"

Aber wie ist es möglich, die Lizenzen an den PC oder Benutzer zu binden, ohne dass es möglich ist, die Lizenz weiter zu geben?


----------



## Kababär (24. Mai 2016)

Füge deinem Programm eine Art User-ID hinzu. Die Lizenz-Datei kann dann nur für diese User-ID gültig sein. Alternativ könntest du das auch via Datenbank machen, aber dann könnte man offline entweder nicht arbeiten oder mächtig tricksen.
So würde ich es auf jeden Fall machen. Ob die Methode bewährt ist, weiß ich nicht. Fest steht, dass die Lizenz eindeutig sein muss, also muss diese eindeutige Informationen beinhalten. Leider bietet dies ein Rechner nicht unbedingt. Vor allem, weil man so gut wie alle Parameter von "Information-Getter" nach Belieben verändern kann, wenn man das Know-How hat oder Google zu bedienen weiß.


----------



## FelixBaum (24. Mai 2016)

Das mit der User-ID ist eine gute Idee. 
Wenn der Kunde dann mehrere Lizenzen kauft, muss halt nur mitgeteilt werden, welche User-ID zu welcher Lizenz gehört. Richtig?

Aber da kann er ja immer noch kopieren und mit der selbem User-ID mehrere Kopien des Programms nutzen. Dieses könnte ich dann über einen Server lösen, der abgleicht, ob die Lizenz schon woanders genutzt wurde oder nicht? Aber ob ich den Nutzer dazu zwischen möchte, dass er beim Arbeiten mit dem Programm ständig mit dem Internet verbunden ist, ist eine andere Frage..


----------



## Kababär (24. Mai 2016)

Naja es gilt halt eine 1:n Beziehung oder eben eine 1:1 Beziehung.
Falls ein User mehrere Lizenzen kauft, erhält sein Programm eben mehrere IDs.
Ob das eine optimale Lösung ist, weiß ich nicht, sicherlich nicht. Im Business wird das garantiert anders gehandelt, aber für Testzwecke sollte dies doch ausreichen.
Man kann die UserID verschlüsseln sowie die Lizenz-ID. Beides sollte der Benutzer nicht erfahren. Er erhält nur die Lizenz-Datei, die er benötigt, um mit dem Programm zu arbeiten.
Wenn du mit RSA verschlüsseln willst, solltest du deinen Public Key lieber behalten. Heißt auch, dass du ihn dir selbst erstellen musst und dich nicht an eine Registrierungsstelle wenden solltest.


----------



## FelixBaum (24. Mai 2016)

ja ok, ich werde es mal ausprobieren. Danke für die Hilfe!


----------



## Neumi5694 (29. Mai 2016)

Mach dir auf jeden Fall auch schon mal Gedanken darüber, wie deine Lizenzverwaltung ausschaut, wie ein User z.B. eine neue Lizenzdatei kriegen kann, wenn er Laptop/PC wechselt, ohne dass die alte weiter verwendbar ist - wenn du das Ganze schon an den PC binden willst.


----------



## Blender3D (30. Mai 2016)

Eine Möglichkeit wäre ein USB-Stick als Dongle.
1) Seriennummer des USB-Stick auslesen. Der öffentliche Schlüssel
2) In der Anwendung versteckt der private  Schlüssel
3) Aus beiden Schlüsseln mittels Formel einen Zielschlüssel berechnen.
4) Zielschlüssel auf den USB Stick speichern
5) Anwendung überprüft alle 30 sec. ob der USB- Stick mit Seriennummer und Zielschlüssel vorhanden ist.


----------



## Thallius (30. Mai 2016)

Naja kurz den decompiler drüber gejagt, den Code der den USB und den key abfragt durch ein Return true ersetzen und das wars.

Aufwand den Schutz zu implementieren: 4-8h je nachdem wie gut der Programmierer ist. 
Aufwand den Schutz zu entfernen: 30-90min je nachdem wie gut der Hacker ist.

Es lohnt sich einfach nicht....

Gruß

Claus


----------



## strußi (30. Mai 2016)

ich hatte mal ein Programm, das mit der Festplattenbezeichung gearbeitet hat, ist das noch ein guter Weg, oder eher hinderlich


----------



## mrBrown (30. Mai 2016)

strußi hat gesagt.:


> ich hatte mal ein Programm, das mit der Festplattenbezeichung gearbeitet hat, ist das noch ein guter Weg, oder eher hinderlich


Genau wie oben schon gesagt, dekompilieren, Methoden die das abfragen umschreiben und fertig 

Vermutlich kann man die ID aber auch Softwaremäßig irgendwie ändern, bzw faxen.


Die meisten Schutzmaßnahmen sind für den ehrlichen Anwender und Programmierer eine größere Hürde, als für einen Hacker und die Nutzer der "freien" Version...


----------



## FelixBaum (30. Mai 2016)

Das mit dem USB-Stick ist im Ansatz ja ne gute Idee.  aber muss ich dann nicht jedes Mal, wenn jemand eine Lizenz kauft, einen USB-Stick verschicken und dieser muss dann immer eingesteckt sein, richtig?


----------



## tommysenf (30. Mai 2016)

Statt das ganze selbst zu implementieren würde ich an deiner Stelle auf bewährte Lösungen setzen:

https://truelicense.java.net
http://www.license4j.com
http://verhas.github.io/License3j/

By the way:

Der Einsatz eines Schutzes auch wenn er knackbar ist macht schon Sinn. In einem Projekt in welches ich vor Jahren mal tätig war wurde der Einsatz einer Softwareversion in 2 Versionen getrackt:

Version1: Kein Passwortschutz
Version2: Einfacher fest einkodierter Lizenzschutz (also über Dekompilierung sehr simpel zu entfernen)

Resultat war: Von Version 1 wurden ca: 39 Prozent ohne Autorisierung genutzt von Version 2 nur 2 Prozent.


----------



## Thallius (30. Mai 2016)

tommysenf hat gesagt.:


> Statt das ganze selbst zu implementieren würde ich an deiner Stelle auf bewährte Lösungen setzen:
> 
> https://truelicense.java.net
> http://www.license4j.com
> ...



Was ist denn das für eine Logik? Wenn es eine kostenlose Version gibt, dann besteht jamauch kein Grund eine kostenpflichtige zu hacken...


----------



## Blender3D (30. Mai 2016)

Thallius hat gesagt.:


> Naja kurz den decompiler drüber gejagt, den Code der den USB und den key abfragt durch ein Return true ersetzen und das wars.
> 
> Aufwand den Schutz zu implementieren: 4-8h je nachdem wie gut der Programmierer ist.
> Aufwand den Schutz zu entfernen: 30-90min je nachdem wie gut der Hacker ist.


Gibt es einen wirklich nicht hackbaren Schutz?


----------



## tommysenf (30. Mai 2016)

Thallius hat gesagt.:


> Was ist denn das für eine Logik? Wenn es eine kostenlose Version gibt, dann besteht jamauch kein Grund eine kostenpflichtige zu hacken...



Es gab keine kostenlose Version, beide Versionen waren kostenpflichtig. Sie wurden nur an verschiedene Kunden verteilt.


----------



## mrBrown (30. Mai 2016)

tommysenf hat gesagt.:


> Es gab keine kostenlose Version, beide Versionen waren kostenpflichtig. Sie wurden nur an verschiedene Kunden verteilt.


Bleibt die gleiche Logik - warum sollte jemand den Schutz knacken, wenn es die Version ohne Schutz schon gibt?


----------



## tommysenf (30. Mai 2016)

mrBrown hat gesagt.:


> Bleibt die gleiche Logik - warum sollte jemand den Schutz knacken, wenn es die Version ohne Schutz schon gibt?



Weil diese Version für ihn nicht Verfügbar ist. Bsp.:
Konzern A bekommt die Software ohne Schutz geliefert.
Konzern B bekommt die Software mit Schutz.

Das es verschiedene Versionen gibt wird nicht öffentlich kommuniziert. Es würde auch nichts bringen, wenn Konzern A die Version von Konzern B nutzt, da unterschiedliche Datenbestände existieren. Anhand der Logs unserer Server konnte daraufhin ausgewertet werden von wie vielen verschiedenen Clients eingesetzt wurden und welche davon sauber lizensiert waren.


----------



## FelixBaum (31. Mai 2016)

tommysenf hat gesagt.:


> Statt das ganze selbst zu implementieren würde ich an deiner Stelle auf bewährte Lösungen setzen:
> 
> https://truelicense.java.net
> http://www.license4j.com
> http://verhas.github.io/License3j/



Ich hab jetzt license3j benutzt, funktioniert sehr gut und simpel.


----------



## Thallius (31. Mai 2016)

Blender3D hat gesagt.:


> Gibt es einen wirklich nicht hackbaren Schutz?



Jain,

Du kannst halt relevante codeteile nur übers Netz erreichbar machen nach vorheriger Authentifizierung. Oder du steckst sie in einen nicht auslesbaren dongle. 
Aber jegliche Software Lösung, vor allem in einer interpretersprache wie Java ist in meinen Augen verschwendete Zeit. Die solltest du lieber in die Weiterentwicklung der Software stecken, so dass der Kunde gerne freiwillig bezahlt eben weil er von der Software begeistert ist.

Gruß

Claus


----------



## stg (31. Mai 2016)

Thallius hat gesagt.:


> Die solltest du lieber in die Weiterentwicklung der Software stecken, so dass der Kunde gerne freiwillig bezahlt eben weil er von der Software begeistert ist.



So schauts aus. Insbesondere lässt sich auch ne Menge Geld mit Customzing und Support verdienen, falls das das Ziel ist.

Übrigens ist auch quelloffener Code dein geistiges Eigentum und ab einem gewissen Grad an Komplexität schützenswert. Heißt, je nachdem unter welcher Lizenz du deinen Code veröffentlichst, dürfen ihn andere trotzdem nicht ohne weiteres verwenden. Wenn es dann doch jemand macht und ein Konkurrent-Produkt auf den Markt bringt, bei dem deine Ideen verwendet werden, kannst du nochmal abkassieren.
Mal ganz davon abgesehen stufe ich quelloffenen Code grundsätzlich erstmal als vertrauenswürdiger ein, wenn der Publisher unbekannt ist.


----------

