Wie generiere und validiere ich einen Softwarelizenzschlüssel?


235

Ich bin derzeit an der Entwicklung eines Produkts (entwickelt in C #) beteiligt, das kostenlos heruntergeladen, aber in einer sehr begrenzten Version installiert werden kann. Um auf alle Funktionen zugreifen zu können, muss der Benutzer eine Lizenzgebühr zahlen und einen Schlüssel erhalten. Dieser Schlüssel wird dann in die Anwendung eingegeben, um die Vollversion zu "entsperren".

Da die Verwendung eines solchen Lizenzschlüssels üblich ist, frage ich mich:

  1. Wie ist das normalerweise gelöst?
  2. Wie kann ich den Schlüssel generieren und wie kann er von der Anwendung validiert werden?
  3. Wie kann ich auch vermeiden, dass ein Schlüssel im Internet veröffentlicht und von anderen verwendet wird, die die Lizenz nicht bezahlt haben (ein Schlüssel, der im Grunde nicht "ihnen" gehört)?

Ich denke, ich sollte den Schlüssel auch irgendwie an die Version der Anwendung binden, damit neue Schlüssel in Feature-Versionen in Rechnung gestellt werden können.

Was sollte ich in diesem Szenario noch denken?

Antworten:


126

Vorsichtsmaßnahme: Sie können Benutzer nicht am Raubkopieren hindern, sondern es ehrlichen Benutzern nur erleichtern, das Richtige zu tun.

Angenommen, Sie möchten nicht für jeden Benutzer einen speziellen Build erstellen, dann:

  • Generieren Sie sich einen geheimen Schlüssel für das Produkt
  • Nimm den Namen des Benutzers
  • Konzentrieren Sie den Benutzernamen sowie den geheimen Schlüssel und den Hash mit (zum Beispiel) SHA1
  • Entpacken Sie den SHA1-Hash als alphanumerische Zeichenfolge. Dies ist der "Produktschlüssel" des einzelnen Benutzers.
  • Führen Sie innerhalb des Programms denselben Hash aus und vergleichen Sie ihn mit dem Produktschlüssel. Wenn gleich, OK.

Aber ich wiederhole: Dies wird Piraterie nicht verhindern


Ich habe kürzlich gelesen, dass dieser Ansatz kryptografisch nicht sehr fundiert ist. Diese Lösung ist jedoch bereits schwach ( da die Software selbst irgendwo den geheimen Schlüssel enthalten muss ), sodass ich nicht denke, dass diese Entdeckung die Lösung so weit wie möglich ungültig macht.

Ich dachte nur, ich sollte das wirklich erwähnen; Wenn Sie vorhaben, daraus etwas anderes abzuleiten, seien Sie vorsichtig.


13
Wenn das Programm den geheimen Schlüssel enthält (wie in den obigen Schritten impliziert), ist das Knacken trivial
Steven A. Lowe

2
bearbeitet, um offensichtlicher zu sein; kann etwas so Grundlegendes nicht überbetonen ;-)
Steven A. Lowe

23
Verwenden Sie eine asymmetrische kryptografische Methode (z. B. RSA) zum Generieren und Decodieren des Produktschlüssels, um zu vermeiden, dass das Geheimnis in den Code eingebettet wird.
Amir Moghimi

6
Ich würde denken, dass jemand, der Ihren Code hackt (möglicherweise auf Assembly-Ebene), um Ihren geheimen Schlüssel zu finden, wahrscheinlich auch auf der Ebene ist, auf der er Ihre Überprüfungen einfach vollständig umgehen kann. Ich glaube nicht, dass es eine Registrierungsmethode gibt, die so sicher ist, dass sie einen guten Hacker überlebt, der das Programm lokal ausführt. Wie der ursprüngliche Kommentar sagte, dreht sich wirklich alles um alles, was es einen Schritt schwieriger macht, als nur die Datei zu kopieren. Viele Spiele haben heutzutage den Kopierschutz aufgegeben und nehmen den Spielinhalt einfach online. In diesem Fall ist der Code nicht in der Hand des Hackers.
JamieB

1
Ist es üblich, Einschränkungen in den Lizenzschlüssel aufzunehmen? Zum Beispiel Zeitbeschränkungen, gleichzeitige Benutzeranzahl, zu installierende Module usw.?
Carlo

97

Es gibt viele Möglichkeiten, Lizenzschlüssel zu generieren, aber nur sehr wenige dieser Möglichkeiten sind wirklich sicher. Und es ist schade, denn für Unternehmen haben Lizenzschlüssel fast den gleichen Wert wie echtes Geld.

Idealerweise möchten Sie, dass Ihre Lizenzschlüssel die folgenden Eigenschaften haben:

  1. Nur Ihr Unternehmen sollte in der Lage sein, Lizenzschlüssel für Ihre Produkte zu generieren, selbst wenn jemand Ihre Produkte vollständig zurückentwickelt (was passieren wird, spreche ich aus Erfahrung). Das Verschleiern des Algorithmus oder das Ausblenden eines Verschlüsselungsschlüssels in Ihrer Software kommt nicht in Frage, wenn Sie die Lizenzierung ernsthaft kontrollieren möchten. Wenn Ihr Produkt erfolgreich ist, wird innerhalb weniger Tage nach der Veröffentlichung jemand einen Schlüsselgenerator herstellen.

  2. Ein Lizenzschlüssel sollte nur auf einem Computer verwendet werden können (oder zumindest sollten Sie dies sehr genau kontrollieren können).

  3. Ein Lizenzschlüssel sollte kurz und einfach über das Telefon einzugeben oder zu diktieren sein. Sie möchten nicht, dass jeder Kunde den technischen Support anruft, weil er nicht versteht, ob der Schlüssel ein "l" oder eine "1" enthält. Ihre Support-Abteilung würde sich dafür bedanken, und Sie werden in diesem Bereich geringere Kosten haben.

Wie lösen Sie diese Herausforderungen?

  1. Die Antwort ist einfach, aber technisch herausfordernd: Digitale Signaturen mit Kryptografie mit öffentlichem Schlüssel. Ihre Lizenzschlüssel sollten tatsächlich signierte "Dokumente" sein, die einige nützliche Daten enthalten und mit dem privaten Schlüssel Ihres Unternehmens signiert sind. Die Signaturen sollten Teil des Lizenzschlüssels sein. Das Produkt sollte die Lizenzschlüssel mit dem entsprechenden öffentlichen Schlüssel validieren. Auf diese Weise kann jemand, der vollen Zugriff auf die Logik Ihres Produkts hat, keine Lizenzschlüssel generieren, da er nicht über den privaten Schlüssel verfügt. Ein Lizenzschlüssel würde folgendermaßen aussehen: BASE32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (HASH (DATA)))) Die größte Herausforderung besteht darin, dass die klassischen Algorithmen für öffentliche Schlüssel große Signaturgrößen aufweisen. RSA512 hat eine 1024-Bit-Signatur. Sie möchten nicht, dass Ihre Lizenzschlüssel Hunderte von Zeichen enthalten. Einer der leistungsfähigsten Ansätze ist die Verwendung der Kryptographie mit elliptischen Kurven (mit sorgfältigen Implementierungen, um die bestehenden Patente zu vermeiden). ECC-Schlüssel sind bei gleicher Stärke etwa sechsmal kürzer als RSA-Schlüssel. Sie können die Signaturgrößen mithilfe von Algorithmen wie dem Schnorr-Algorithmus für digitale Signaturen weiter reduzieren (Patent 2008 abgelaufen - gut :))

  2. Dies kann durch Produktaktivierung erreicht werden (Windows ist ein gutes Beispiel). Grundsätzlich müssen Sie für einen Kunden mit einem gültigen Lizenzschlüssel einige "Aktivierungsdaten" generieren, bei denen es sich um eine signierte Nachricht handelt, in die die Hardware-ID des Computers als signierte Daten eingebettet ist. Dies erfolgt normalerweise über das Internet, jedoch nur EINMAL: Das Produkt sendet den Lizenzschlüssel und die Computerhardware-ID an einen Aktivierungsserver, und der Aktivierungsserver sendet die signierte Nachricht zurück (die auch kurz und einfach über das zu diktieren ist Telefon). Von diesem Moment an überprüft das Produkt beim Start nicht mehr den Lizenzschlüssel, sondern die Aktivierungsdaten, für deren Validierung der Computer identisch sein muss (andernfalls wären die DATEN unterschiedlich und die digitale Signatur würde nicht validiert).

  3. Entfernen Sie einfach redundante Zeichen wie "1", "l", "0", "o" aus Ihren Schlüsseln. Teilen Sie die Lizenzschlüsselzeichenfolge in Zeichengruppen auf.


8
Könnten sie nicht einfach die Software bearbeiten, um Code hinzuzufügen / zu entfernen, sodass die Prüfung vollständig übersprungen wird?
Pacerier

Erfordert die Antwort auf Nummer 1 im Wesentlichen einen Online-Aktivierungs- / Deaktivierungsdienst?
Dan W

2
Ich möchte darauf hinweisen, wie weit diese Antwort der anderen Haschisch-Sache überlegen ist.
Erik Aronesty

1
@Pacerier Es gibt viele Dinge, vor denen Lizenzschlüssel Softwareunternehmen schützen. Das Ändern der Exe gehört nicht dazu.
Erik Aronesty

1
Es ist erwähnenswert, dass es auch mit assymetrischen Kryptografie-privaten / öffentlichen Schlüsseln möglich ist, gefälschte Lizenzen zu generieren, indem einfach der in der Software gelieferte öffentliche Schlüssel durch einen anderen öffentlichen Schlüssel ersetzt und der entsprechende private Schlüssel zum Signieren der gefälschten Lizenz verwendet wird. Aus diesem Grund haben und brauchen wir übrigens vertrauenswürdige Zertifizierungsstellen, die öffentliche Schlüssel an Identitäten binden. Dies könnte zwar einen weiteren Reifen zum Durchspringen hinzufügen, garantiert jedoch nicht die Nummer 1.
Saeb Amini

76

Einfache Antwort - Egal welches Schema Sie verwenden, es kann geknackt werden.

Bestrafen Sie ehrliche Kunden nicht mit einem System, das Hacker verhindern soll, da Hacker es trotzdem knacken werden.

Ein einfacher Hash-Code, der an eine E-Mail oder ähnliches gebunden ist, ist wahrscheinlich gut genug. Hardwarebasierte IDs werden immer dann zu einem Problem, wenn Benutzer Hardware neu installieren oder aktualisieren müssen.

Guter Thread zu diesem Thema: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34


2
Einverstanden, Sie möchten die Benutzer, die Ihr Produkt tatsächlich kaufen, nicht verärgern! (Achten Sie auf m $, Apfel usw.)
Jason

2
MS, Apple usw. können damit durchkommen, da sie groß sind und Kernprodukte anbieten, die anderswo schwer zu bekommen sind oder einen großen Marktschatten haben, mit dem sie Menschen zwingen können. Der kleine Entwickler kann nicht.
Schoner

1
Ein Signaturschema für Pub- / Priv-Schlüssel kann nicht "geknackt" werden, um neue gültige Schlüssel für Benutzer zu erstellen, die signierten Code ausführen möchten, der von der Publisher-Site heruntergeladen wurde, anstatt geknackte Software. Während ein Hash / symmetrisches Schema geknackt werden kann, um neue gültige Lizenzschlüssel zu erzeugen, die nicht von ungültigen zu unterscheiden sind. Großer Unterschied.
Erik Aronesty

Defekter Link ....
stigzler vor

56

Vergessen Sie beim Generieren des Schlüssels nicht, die Version und die Build-Nummer mit der Zeichenfolge zu verknüpfen, für die Sie den Hash berechnen. Auf diese Weise gibt es keinen einzigen Schlüssel, der alles freischaltet, was Sie jemals veröffentlicht haben.

Nachdem Sie einige Schlüssel oder Patches in astalavista.box.sk gefunden haben , wissen Sie, dass es Ihnen gelungen ist, etwas so populär zu machen, dass sich jemand die Mühe gemacht hat, es zu knacken. Jubeln!


8
"Vergessen Sie nicht, die Version und die Build-Nummer mit der Zeichenfolge zu verknüpfen, für die Sie den Hash berechnen" - aber wird dadurch der Schlüssel nicht beschädigt, wenn der Benutzer auf eine kleinere Patch-Version aktualisiert?
thomthom

1
@thomthom Wie wäre es dann, einem Schlüssel eine maximale Version zuzuordnen? Die Versionsidee selbst ist plausibel und erhöht die Sicherheit
Marvin Thobejane

@MarvinThobejane Um eine maximale Version zuzuordnen, können Sie die maximal zulässige Version signieren und den Code die Version ein wenig wiederholen lassen. aber keine> = ops in sigs erlaubt.
Erik Aronesty

22

Neben dem, was bereits gesagt wurde ....

Jede Verwendung von .NET-Anwendungen kann aufgrund von Problemen mit der Zwischensprache von Natur aus unterbrochen werden. Durch eine einfache Demontage des .NET-Codes wird Ihr Produkt für jedermann geöffnet. Sie können Ihren Lizenzcode an diesem Punkt leicht umgehen.

Sie können nicht einmal mehr Hardwarewerte verwenden, um einen Schlüssel zu erstellen. Mit virtuellen Maschinen kann jetzt jemand ein Image einer "lizenzierten" Maschine erstellen und auf einer beliebigen Plattform ausführen.

Wenn es teure Software ist, gibt es andere Lösungen. Wenn nicht, machen Sie es dem Gelegenheitshacker nur schwer genug. Und akzeptieren Sie die Tatsache, dass es irgendwann nicht lizenzierte Kopien geben wird.

Wenn Ihr Produkt kompliziert ist, bieten die inhärenten Supportprobleme einen gewissen Schutz für Sie.


9
+1 zur Vermeidung von Schwachstellen bei Hardwarewerten aufgrund virtueller Maschinen.
Rubens Mariuzzo

3
Dafür gibt es eine starke Benennung für .NET und Authenticode für die PE-Signatur. Wenn jemand Ihre Bibliothek dekompiliert, geändert und neu erstellt hat, wird sie nicht signiert und die Anwendung wird einfach nicht ausgeführt. Die virtuelle .NET-Maschine lässt dies nicht zu.
Stephen Tunney

2
Durch das Signieren wird der Ursprung des Programms überprüft, das Sie ausführen möchten. Wenn sich der Benutzer nicht um den Ursprung kümmert, weil er weiß, dass er modifiziert und geknackt ist, würde der Cracker die Signatur entfernen oder sie sogar mit seiner eigenen Signatur signieren. Durch das Signieren werden keine vertrauenswürdigen Assemblys mehr mit nicht vertrauenswürdigen Assemblys gemischt.
Jesusduarte

Eine mobile App kann als Hardware-Dongle für teure Software verwendet werden. Bezahlen Sie einfach mit der App und binden Sie einen Signaturschlüssel in das sichere Element der App ein. dann können Sie mit dem Desktop + App aktivieren ... den anderen Desktop deaktivieren. Das Zusammenfassen einiger kritischer Abschnittscodebereiche in der App und / oder in homomorphen Online-Berechnungsdiensten kann dazu beitragen, eine triviale Dekompilierung zu verhindern.
Erik Aronesty

12

Die C # / .NET-Engine, die wir für die Generierung von Lizenzschlüsseln verwenden, wird jetzt als Open Source verwaltet:

https://github.com/appsoftware/.NET-Licence-Key-Generator .

Es basiert auf einem "Partial Key Verification" -System, dh, nur eine Teilmenge des Schlüssels, den Sie zum Generieren des Schlüssels verwenden, muss in Ihre verteilbare Datei kompiliert werden. Sie erstellen die Schlüssel selbst, sodass die Lizenzimplementierung nur für Ihre Software gilt.

Wie oben erwähnt, ist es relativ einfach, die meisten Lizenzierungssysteme zu umgehen, wenn Ihr Code dekompiliert werden kann.


Wären Sie bereit, ein Tutorial für die Verwendung dieses Produkts zu erstellen? Ich fand ihr Wiki etwas mangelhaft.
Anthony Ruffino

Das Projekt wurde jetzt auf GitHub als Open-Source-Version bereitgestellt, wenn dies hilft (Antwort mit Link bearbeitet).
gb2d

10

Ich bin einer der Entwickler hinter den Cryptolens Softwarelizenzierungsplattform und arbeite seit meinem 14. Lebensjahr an Lizenzierungssystemen. In diese Antwort habe ich einige Tipps aufgenommen, die auf den im Laufe der Jahre gesammelten Erfahrungen basieren.

Der beste Weg, dies zu lösen, besteht darin, einen Lizenzschlüsselserver einzurichten, den jede Instanz der Anwendung aufruft, um einen Lizenzschlüssel zu überprüfen.

Vorteile eines Lizenzschlüsselservers

Die Vorteile eines Lizenzschlüsselservers sind:

  1. Sie können einen Lizenzschlüssel jederzeit mit sofortiger Wirkung aktualisieren oder blockieren.
  2. Jeder Lizenzschlüssel kann für eine bestimmte Anzahl von Computern gesperrt werden (dies verhindert, dass Benutzer den Lizenzschlüssel online veröffentlichen, damit andere ihn verwenden können).

Überlegungen

Durch die Online-Überprüfung von Lizenzen erhalten Sie zwar mehr Kontrolle über jede Instanz der Anwendung, die Internetverbindung ist jedoch nicht immer vorhanden (insbesondere, wenn Sie auf größere Unternehmen abzielen). Daher benötigen wir eine andere Möglichkeit, die Überprüfung des Lizenzschlüssels durchzuführen.

Die Lösung besteht darin, die Lizenzschlüsselantwort vom Server immer mit einem Kryptosystem mit öffentlichem Schlüssel wie RSA oder ECC zu signieren (möglicherweise besser, wenn Sie planen, auf eingebetteten Systemen ausgeführt zu werden). Ihre Anwendung sollte nur den öffentlichen Schlüssel haben , um die Antwort des Lizenzschlüssels zu überprüfen.

Falls keine Internetverbindung besteht, können Sie stattdessen die vorherige Lizenzschlüsselantwort verwenden. Stellen Sie sicher, dass sowohl das Datum als auch die Computerkennung in der Antwort gespeichert sind, und stellen Sie sicher, dass diese nicht zu alt ist (z. B. Benutzer dürfen höchstens 30 Tage offline sein usw.) und dass die Antwort auf den Lizenzschlüssel zum richtigen Gerät gehört.

Beachten Sie, dass Sie immer die Antwort auf das Zertifikat des Lizenzschlüssels überprüfen sollten, auch wenn Sie mit dem Internet verbunden sind, um sicherzustellen, dass es seit dem Verlassen des Servers nicht geändert wurde (dies muss auch dann noch durchgeführt werden, wenn Ihre API auf das Lizenzschlüsselserver verwendet https)

Geheime Algorithmen schützen

Die meisten .NET-Anwendungen können recht einfach rückentwickelt werden (es gibt sowohl einen von Microsoft bereitgestellten Diassembler zum Abrufen des IL-Codes als auch einige kommerzielle Produkte, die den Quellcode in z. B. C # abrufen können). Natürlich können Sie den Code immer verschleiern, aber er ist niemals 100% sicher.

In den meisten Fällen besteht der Zweck jeder Softwarelizenzierungslösung darin, ehrlichen Menschen dabei zu helfen, ehrlich zu sein (dh dass ehrliche Benutzer, die bereit sind zu zahlen, nicht vergessen, nach Ablauf einer Testversion zu zahlen usw.).

Möglicherweise haben Sie jedoch noch Code, den Sie auf keinen Fall an die Öffentlichkeit weitergeben möchten (z. B. einen Algorithmus zur Vorhersage der Aktienkurse usw.). In diesem Fall besteht der einzige Weg darin, einen API-Endpunkt zu erstellen , den Ihre Anwendung jedes Mal , wenn die Methode ausgeführt werden soll. Es erfordert eine Internetverbindung, stellt jedoch sicher, dass Ihr Geheimcode niemals vom Client-Computer ausgeführt wird.

Implementierung

Wenn Sie nicht alles selbst implementieren möchten, würde ich empfehlen, sich dieses Tutorial (Teil von Cryptolens ) anzusehen.


Eine Frage zum Einschränken des gespeicherten Lizenzschlüssels, um nicht zu alt zu sein: Da der PC möglicherweise nicht mit dem Internet verbunden ist, können Datum und Uhrzeit immer wieder geändert werden, um das gleiche gültige Datum beizubehalten.
Amir Mahdi Nassiri

Können Benutzer den Online-Lizenzserver nicht umgehen, indem sie einen Loopback-Host in Windows definieren? Ich habe viele Anwendungen gesehen, die so raubkopiert wurden. Resharper und Matlab sind diejenigen, an die ich mich erinnern kann.
Amir Mahdi Nassiri

1
@AmirMahdiNassiri Zu Frage 1: Wenn der PC permanent offline ist, können Sie einen Echtzeituhr-Dongle (RTC) als vertrauenswürdige Zeitquelle verwenden. Zu Frage 2: Da die Antwort mit dem privaten Schlüssel des Anbieters signiert (und mit dem öffentlichen Schlüssel in der Anwendung überprüft) ist, müsste ein Gegner die Datei erneut signieren, ohne den privaten Schlüssel zu kennen, der zum Zeitpunkt des Schreibens vorhanden ist Mit 2048-Bit-RSA-Schlüsseln nicht möglich.
Artem

7

Ich habe in der Vergangenheit Crypkey verwendet . Es ist eines von vielen verfügbaren.

Sie können Software nur bis zu einem gewissen Punkt mit einem Lizenzierungsschema schützen.


6

Ich weiß nicht, wie ausführlich Sie werden wollen

aber ich glaube, dass .net auf die Seriennummer der Festplatte zugreifen kann.

Sie könnten das Programm Ihnen das und etwas anderes schicken lassen (wie Benutzername und Mac-Adresse des Nic)

Darauf basierend berechnen Sie einen Code und senden ihm den Schlüssel per E-Mail zurück.

Sie werden sie davon abhalten, Maschinen zu wechseln, nachdem sie den Schlüssel haben.


4
Und halten Sie sie davon ab, eine tote HD unter anderen Thigns zu ersetzen, was zu Frustration führt. Leider gibt es keine einfache Antwort. Sie müssen das Vertrauen mit den grundlegenden Lizenzierungsmechanismen in Einklang bringen.
Schoner

Arbeitete viele Jahre als Softwareentwickler mit einem Produkt, das die Seriennummer von der Festplatte verwendete, und war für diejenigen, die wussten, wie man es aktualisiert, völlig unsicher.
Oden

Ich wollte diese Nummer mit anderen Dingen (Mac-Adresse, FQDN) verwenden, um sie alle in einen Hash zu werfen. Der Punkt ist, es etwas schwieriger zu machen, all diese Daten zu fälschen, als die Software in erster Linie rückzuentwickeln und die Prüfung zu entfernen, da dies immer eine Option ist.
Crash893

4

Die einzige Möglichkeit, alles zu tun, wonach Sie gefragt haben, besteht darin, einen Internetzugang und eine Überprüfung mit einem Server zu verlangen. Die Anwendung muss sich mit dem Schlüssel beim Server anmelden und anschließend die Sitzungsdetails wie die IP-Adresse speichern. Dadurch wird verhindert, dass der Schlüssel auf mehreren verschiedenen Computern verwendet wird. Dies ist normalerweise bei den Benutzern der Anwendung nicht sehr beliebt, und es sei denn, dies ist eine sehr teure und komplizierte Anwendung, es lohnt sich nicht.

Sie könnten einfach einen Lizenzschlüssel für die Anwendung haben und dann auf der Clientseite prüfen, ob der Schlüssel gut ist. Es ist jedoch einfach, diesen Schlüssel an andere Benutzer zu verteilen, und mit einem Dekompiler können neue Schlüssel generiert werden.


5
Ich habe bei einer Firma gearbeitet, die ein internetbasiertes Lizenzierungsschema verwendet hat. Jedes Mal, wenn das Programm gestartet wurde, ging es online, um es zu validieren. Ich glaube, das Unternehmen gab mehr Geld für Infrastruktur und Entwickler für ihre Lizenzlösung aus, als sie durch Piraterie verloren hätten (sie waren ein Nischenprodukt).
Jason

3
Darüber hinaus waren die Kosten für den technischen Support enorm. Viele Male hat ein Benutzer einen anderen Computer verwendet, um die Software auszuführen, aber der Hash war anders, was zu massivem technischen Support führte. Kurz gesagt, was Schoner gesagt hat - bestrafen Sie keine ehrlichen Benutzer.
Jason

1
Es scheint, dass Ihr Unternehmen etwas übereifrig war, da jedes Mal beim Start eine Validierung erforderlich war.
jugg1es

@ Jason, Nun, sie sollten den Preis des Produkts erhöhen.
Pacerier

1
@ Pacerier: Falsche Antwort.
Leichtigkeitsrennen im Orbit

4

Ich habe eine internetbasierte einmalige Aktivierung in der Software meines Unternehmens (C # .net) implementiert, für die ein Lizenzschlüssel erforderlich ist, der sich auf eine in der Datenbank des Servers gespeicherte Lizenz bezieht. Die Software trifft den Server mit dem Schlüssel und erhält Lizenzinformationen, die dann lokal mit einem RSA-Schlüssel verschlüsselt werden, der aus einigen Variablen (eine Kombination aus CPUID und anderen Dingen, die sich nicht oft ändern) auf dem Clientcomputer generiert wird, und diese dann speichert die Registrierung.

Es erfordert einige serverseitige Codierung, aber es hat für uns sehr gut funktioniert und ich konnte das gleiche System verwenden, als wir auf browserbasierte Software umgestiegen sind. Außerdem erhalten Ihre Vertriebsmitarbeiter hervorragende Informationen darüber, wer, wo und wann die Software verwendet wird. Jedes Lizenzsystem, das nur lokal gehandhabt wird, ist vollständig anfällig für Ausnutzung, insbesondere bei der Reflexion in .NET . Aber wie alle anderen gesagt haben, ist kein System völlig sicher.

Wenn Sie keine webbasierte Lizenzierung verwenden, macht es meiner Meinung nach keinen Sinn, die Software überhaupt zu schützen. Mit den Kopfschmerzen, die DRM verursachen kann, ist es nicht fair gegenüber den Benutzern, die tatsächlich dafür bezahlt haben, dass sie leiden.


1
Das Hauptproblem bei der Weblizenzierung besteht jedoch darin, dass der Lizenzierungsdienst zu einem Hauptziel für DDoS-Angriffe wird. Dies lähmt entweder den Dienst oder erhöht die Cloud-Kosten.
afk5min

4
Das ist so, als würde man sagen, dass es keinen Sinn macht, eine Website zu haben, weil sie für DDoS-Angriffe anfällig ist ...
jugg1es

@ jugg1es Nirgendwo in seinem Kommentar sagte er "es hat keinen Sinn". Er wies lediglich darauf hin, dass es sich um eine Sicherheitslücke handelt, die berücksichtigt werden sollte.
Dan Bechard

Und die Schecks können weiterhin im Client entfernt werden. Keine Überprüfung, keine webbasierte Lizenzierung ...
Azarai

1
Meinen Sie den tatsächlichen Anwendungscode mit "erforderlichen Informationen"? Code, der zum Ausführen der App erforderlich wäre? Andernfalls würde ich denken, dass es immer noch dazu führt, dass isLicensed-Prüfmethoden in einem Code aufgerufen werden.
Azarai

4

Ich bin der festen Überzeugung, dass hier nur ein auf Kryptografie basierendes Lizenzierungssystem mit öffentlichem Schlüssel der richtige Ansatz ist, da Sie keine wesentlichen Informationen, die für die Lizenzgenerierung erforderlich sind, in Ihren Quellcode aufnehmen müssen.

In der Vergangenheit habe ich Treeks Lizenzbibliothek viele Male verwendet, weil sie diese Anforderungen erfüllt und einen wirklich guten Preis bietet. Es verwendet den gleichen Lizenzschutz für Endbenutzer und sich selbst, und niemand hat dies bisher geknackt. Auf der Website finden Sie auch gute Tipps, um Piraterie und Cracking zu vermeiden.


Würde die Kryptografie mit öffentlichen Schlüsseln die Verwendung eines Online-Aktivierungsdienstes erfordern? Ich meine, wenn es nicht im Quellcode ist (ich nehme an, Sie meinen auch die ausführbare Datei), wo könnte es sonst sein?
Dan W

Nein, Sie müssen den Online-Aktivierungsdienst nicht verwenden. Sie können Lizenzdateien vollständig offline generieren.
Panpernicek

Der Schlüssel liegt in der Tatsache, dass Sie nur öffentlichen Schlüssel für Code platzieren, der nicht für die Lizenzgenerierung verwendet werden kann. Nur zur Überprüfung.
Panpernicek

3

Wie einige andere bereits erwähnt haben, bin ich ein großer Gegner der standardmäßigen Kundenfeindlichkeit - etwas, für das die Lizenzbranche berüchtigt ist. Daher werde ich eine gute Lösung für Ihr Problem erläutern, die auch eine gute Kunden-UX bietet .

Zunächst haben Sie erwähnt, dass Sie über eine "eingeschränkte" Version Ihrer Software verfügen, mit der Sie versuchen, Kunden für zusätzliche Funktionen in "Upgrade" umzuwandeln. Sie suchen also nach Funktionslizenzen für Ihr Produkt, z. B. kann ein Kunde eine Lizenz für Feature-X oder Feature-Y erwerben .

Ich habe Keygen für diese Art der Lizenzierung entwickelt. Keygen ist eine Lizenzierungs-REST-API, mit der Sie Benutzerkonten und Lizenzen verwalten und auch die Computernutzung / -zuordnungen verfolgen können.

Was ich tun würde , ist eingerichtet 2 Lizenztypen (eine Politik innerhalb Keygen) , wo man eine Basisrichtlinie für die begrenzte kostenlose Version ist, und das andere ist eine Politik für die kostenpflichtige Version.

Ich bin mir nicht sicher, was Sie für Zahlungen verwenden, aber nehmen wir an, Sie verwenden so etwas wie Stripe (heutzutage ziemlich Standard), das Webhooks anbietet . Keygen hat auch Webhooks (ob Sie es verwenden oder nicht, all dies gilt immer noch). Sie können Keygen integrieren, um mit Ihrem Zahlungsanbieter über Webhooks von beiden Seiten zu sprechen (denken Sie daran: customer.created-> Basislizenz für Kunden erstellen, license.created-> Kunden für die neue Lizenz belasten).

Durch die Verwendung von Webhooks können wir die Lizenzerstellung für neue Kunden automatisieren. Was ist also mit der Lizenzvalidierung in der Anwendung selbst? Dies kann auf verschiedene Arten erfolgen. Am beliebtesten ist es jedoch, wenn Ihr Kunde einen langen Lizenzschlüssel in ein Eingabefeld eingeben muss, das Sie dann validieren können. Ich denke, dies ist eine schreckliche Möglichkeit, die Lizenzvalidierung in Ihrer Anwendung durchzuführen.

Warum denke ich das? Erstens müssen Sie von Ihrem Kunden einen langwierigen Lizenzschlüssel eingeben, der für den Maschinenverbrauch bestimmt ist, und zweitens müssen Sie und Ihr Kunde den langwierigen Lizenzschlüssel nachverfolgen .

Okay, was ist eine Alternative? Ich denke, die beste Alternative ist, etwas zu tun, an das alle Ihre Kunden gewöhnt sind: Sie können mit einer E-Mail / einem Passwort ein Konto für Ihr Produkt erstellen . Sie können dann alle ihre Lizenzen und ihre Computer diesem Konto zuordnen. Anstatt einen Lizenzschlüssel einzugeben, können sie sich jetzt einfach mit ihren Anmeldeinformationen anmelden.

Welchen Vorteil bringt Ihnen das? Erstens müssen Sie und Ihre Kunden die Lizenzschlüssel nicht mehr im Auge behalten. da alles hinter den Kulissen ihres Benutzerkontos erledigt wird und vor allem: Sie können Ihren Kunden jetzt Self-Service-Lizenzen und -Maschinen anbieten Aktivierung! Das heißt, da alle Lizenzen und Computer ihrem Benutzerkonto zugeordnet sind, können Sie sie zum Kauf einer Lizenz auffordern, wenn sie Ihre Anwendung auf einem nicht erkannten Computer starten.

Jetzt zur Lizenzüberprüfung : Wenn sich Ihr Kunde mit seiner E-Mail-Adresse / seinem Kennwort bei Ihrer Anwendung anmeldet, können Sie sein Benutzerkonto nach den Lizenzen abfragen, die er besitzt, um festzustellen, ob er Feature-X oder verwenden kann Feature-Y verwenden kann . Und da Ihre Anwendung jetzt Self-Service ist , können Sie Ihren Kunden ermöglichen, zusätzliche Funktionen direkt in Ihrer Anwendung zu erwerben!

Wir haben also eine Menge Automatisierung in unser Lizenzierungssystem eingeführt. Wir können einzelne Funktionen lizenzieren (dh eine eingeschränkte oder eine Vollversion). Wir haben eine großartige Version angeboten unseren Kunden UX und wir haben auch einen der größten Gründe gemildert Für Supportanfragen: Wiederherstellung des Lizenzschlüssels.

Wie auch immer, das wurde lang, aber hoffentlich hilft es jemandem!


Ich kann mir nicht vorstellen, dass eine DLL in einer Unternehmensentwicklungssituation so lizenziert wird. Denken Sie beispielsweise an automatisierte Build- und Bereitstellungsszenarien. Oder fügen Sie diesen Schritt einfach zu den vielen hinzu, die normalerweise zum Einrichten eines Entwicklercomputers erforderlich sind. Für mich müssen Lizenzschlüssel vorab ausgestellt werden und nicht auf einzelnen Computern basieren, um praktisch zu sein
DvS

2

Es ist nicht möglich, Softwarepiraterie vollständig zu verhindern. Sie können gelegentliche Piraterie verhindern, und genau das tun alle Lizenzierungslösungen.

Die Lizenzierung mit Knoten (Computer) ist am besten, wenn Sie die Wiederverwendung von Lizenzschlüsseln verhindern möchten. Ich benutze Cryptlex seit ungefähr einem Jahr für meine Software. Es gibt auch einen kostenlosen Tarif. Wenn Sie also nicht zu viele Kunden erwarten, können Sie ihn kostenlos nutzen.


2

Sie können eine kostenlose Drittanbieterlösung verwenden, um dies für Sie zu erledigen, z. B. Quantum-Key.Net. Es ist kostenlos und verarbeitet Zahlungen per Paypal über eine von ihm erstellte Web-Verkaufsseite, die Schlüsselausgabe per E-Mail und sperrt die Schlüsselverwendung für einen bestimmten Computer Piraterie verhindern.

Sie sollten auch darauf achten, Ihren Code zu verschleiern / zu verschlüsseln, da er sonst mithilfe von Software wie De4dot und .NetReflector problemlos rückentwickelt werden kann. Ein guter kostenloser Code-Verschleierer ist ConfuserEx, der schnell und einfach zu verwenden und effektiver als teure Alternativen ist.

Sie sollten Ihre fertige Software über De4Dot und .NetReflector ausführen, um sie rückzuentwickeln und zu sehen, was ein Cracker sehen würde, wenn er dasselbe tun würde, und um sicherzustellen, dass Sie keinen wichtigen Code offen oder unverstellt gelassen haben.

Ihre Software ist weiterhin knackbar, aber für den Gelegenheits-Cracker kann es durchaus ausreichen, sie zu verschieben, und diese einfachen Schritte verhindern auch, dass Ihr Code extrahiert und wiederverwendet wird.

https://quantum-key.net

Wie benutze ich ConfuserEx?

https://github.com/0xd4d/de4dot

https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.