wake-up-neo.com

Wie kann ich einen Softwarelizenzschlüssel generieren und validieren?

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

Da es so üblich ist, einen solchen Lizenzschlüssel zu verwenden, 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 wird und von anderen verwendet wird, die die Lizenz nicht bezahlt haben (ein Schlüssel, der im Grunde nicht "ihr" ist)? 

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

Gibt es noch etwas, worüber ich in diesem Szenario nachdenken sollte?

204
Riri

Vorbehalt: Sie können Benutzer nicht an der Piraterie hindern, sondern machen es nur ehrlichen Benutzern leichter, das Richtige zu tun.

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

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

Aber ich wiederhole: das wird Piraterie nicht verhindern  


Ich habe kürzlich gelesen, dass dieser Ansatz kryptographisch nicht sehr solide ist. Aber diese Lösung ist bereits schwach ( da die Software selbst irgendwo den geheimen Schlüssel enthalten muss ), so glaube ich nicht, dass diese Entdeckung die Lösung ungültig macht, soweit sie funktioniert.

Ich dachte nur, ich sollte das wirklich erwähnen. Wenn Sie vorhaben, daraus etwas anderes abzuleiten, sollten Sie aufpassen.

116

Es gibt viele Möglichkeiten, Lizenzschlüssel zu generieren, aber nur wenige davon sind wirklich sicher. Und das 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 komplett zurückentwickelt (was auch passieren wird, was ich erlebe, ich spreche aus Erfahrung). Das Verschleiern des Algorithmus oder das Ausblenden eines Verschlüsselungsschlüssels in Ihrer Software ist wirklich unmöglich, wenn Sie die Lizenzierung wirklich ernst nehmen möchten. Wenn Ihr Produkt erfolgreich ist, erstellt jemand innerhalb weniger Tage nach der Veröffentlichung einen Schlüsselgenerator.

  2. Ein Lizenzschlüssel sollte nur auf einem Computer verwendet werden können (oder Sie sollten dies zumindest 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 Supportabteilung würde sich dafür bedanken, und Sie haben geringere Kosten in diesem Bereich.

Wie lösen Sie diese Herausforderungen?

  1. Die Antwort ist einfach, aber technisch anspruchsvoll: Digitale Signaturen mit Public-Key-Kryptographie. 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 können selbst dann keine Lizenzschlüssel generiert werden, wenn jemand vollen Zugriff auf die Logik Ihres Produkts hat, 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 Public-Key-Algorithmen große Signaturgrößen aufweisen. RSA512 hat eine 1024-Bit-Signatur. Sie möchten nicht, dass Ihre Lizenzschlüssel hunderte von Zeichen enthalten ... Eine der effektivsten Methoden ist die Verwendung der Kryptographie mit elliptischen Kurven (mit sorgfältiger Implementierung, um die vorhandenen Patente zu vermeiden). ECC-Schlüssel sind bei gleicher Stärke 6-mal kürzer als RSA-Schlüssel. Sie können die Signaturgröße mithilfe von Algorithmen wie dem digitalen Signaturalgorithmus von Schnorr 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 "Aktivierungsdaten" generieren, bei denen es sich um eine signierte Nachricht handelt, die die Hardware-ID des Computers als signierte Daten enthält. Dies geschieht 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 gemacht werden kann und leicht über das Netzwerk diktiert werden kann Telefon). Von diesem Moment an prüft das Produkt nicht den Lizenzschlüssel beim Start, sondern die Aktivierungsdaten, für deren Überprüfung der Computer identisch sein muss (andernfalls wären die DATEN unterschiedlich und die digitale Signatur nicht gültig). Beachten Sie, dass für die Überprüfung der Aktivierungsdaten keine Überprüfung über das Internet erforderlich ist. Es reicht aus, die digitale Signatur der Aktivierungsdaten mit dem bereits im Produkt integrierten öffentlichen Schlüssel zu überprüfen.

  3. Nun, entfernen Sie einfach redundante Zeichen wie "1", "l", "0", "o" von Ihren Schlüsseln. Teilen Sie die Lizenzschlüsselzeichenfolge in Gruppen von Zeichen auf.

75
Catalin S.

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

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

Ein einfacher gehashter Code, der an ihre E-Mail oder ähnliches gebunden ist, ist wahrscheinlich gut genug. Hardware-basierte IDs werden immer dann zum Problem, wenn Benutzer Hardware neu installieren oder aktualisieren müssen.

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

67
schooner

Vergessen Sie beim Generieren des Schlüssels nicht, die Version und die Build-Nummer mit der Zeichenfolge zu verketten, für die der Hash berechnet wird. Auf diese Weise wird es keinen einzigen Schlüssel geben, der alles freigibt, was Sie jemals veröffentlicht haben. 

Nachdem Sie einige Schlüssel oder Patches gefunden haben, die sich in astalavista.box.sk befinden, wissen Sie, dass es Ihnen gelungen ist, etwas populäres zu machen, das jemandem geknackt hat. Jubeln!

50
shoosh

Abgesehen davon, was schon gesagt wurde ....

Jede Verwendung von .NET-Anwendungen kann aufgrund von Problemen mit der Zwischensprache inhärent sein. Eine einfache Demontage des .NET-Codes öffnet Ihr Produkt für jedermann. Sie können Ihren Lizenzcode an diesem Punkt leicht umgehen. 

Sie können nicht einmal Hardwarewerte verwenden, um einen Schlüssel zu erstellen. Virtuelle Maschinen ermöglichen es nun jemandem, ein Image einer "lizenzierten" Maschine zu erstellen und auf einer beliebigen Plattform auszuführen.

Bei teurer Software gibt es andere Lösungen. Wenn nicht, machen Sie es für den Gelegenheitshacker einfach schwierig. Und akzeptieren Sie die Tatsache, dass es irgendwann draußen nicht lizenzierte Kopien geben wird.

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

21
Brant Herrett

Die C #/.NET-Engine, die wir zur 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, das bedeutet, dass nur eine Teilmenge des Schlüssels, den Sie zum Generieren des Schlüssels verwenden, in Ihre Verteilungsdatei kompiliert werden muss. Sie erstellen die Schlüssel selbst, sodass die Lizenzimplementierung für Ihre Software eindeutig ist.

Wenn Ihr Code dekompiliert werden kann, können die meisten Lizenzierungssysteme relativ leicht umgangen werden. 

10
gb2d

Ich habe Crypkey in der Vergangenheit benutzt. Es ist einer von vielen verfügbar.

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

6
Mitch Wheat

Ich weiß nicht, wie ausführlich du sein willst

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

sie könnten sich das Programm und das etwas schicken lassen (wie Benutzername und MAC-Adresse des NIC).

sie berechnen daraus einen Code und senden den Schlüssel per E-Mail zurück.

sie werden sie davon abhalten, die Maschine nach dem Schlüsselwechsel zu wechseln.

6
Crash893

Die einzige Möglichkeit, um alles, was Sie wollten, zu tun, besteht darin, einen Internetzugang und eine Überprüfung mit einem Server anzufordern. Die Anwendung muss sich mit dem Schlüssel beim Server anmelden. Anschließend müssen Sie die Sitzungsdetails wie die IP-Adresse speichern. Dadurch wird verhindert, dass der Schlüssel auf mehreren verschiedenen Maschinen verwendet wird. Dies ist in der Regel bei den Anwendern der Anwendung nicht sehr beliebt, und wenn dies keine sehr teure und komplizierte Anwendung ist, lohnt es sich nicht.

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

4
Marius

Ich habe die internetbasierte einmalige Aktivierung der Software meines Unternehmens (C # .net) implementiert, für die ein Lizenzschlüssel erforderlich ist, der auf eine in der Datenbank des Servers gespeicherte Lizenz verweist. Die Software schlägt mit dem Schlüssel auf den Server und erhält Lizenzinformationen, die lokal mit einem RSA-Schlüssel verschlüsselt werden, der aus einigen Variablen (einer Kombination aus CPU-ID und anderen Elementen, die sich nicht oft ändern) auf dem Clientcomputer generiert wird, und speichert sie anschließend in die Registrierung 

Es erfordert einige serverseitige Codierungen, aber es hat wirklich gut für uns funktioniert und ich konnte dasselbe System verwenden, als wir auf browserbasierte Software erweitert wurden. Außerdem erhalten Ihre Vertriebsmitarbeiter gute 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 die Ausnutzung von , insbesondere bei der Reflektion in .NET. Aber wie alle anderen gesagt haben, ist kein System vollkommen sicher. 

Meines Erachtens gibt es keinen wirklichen Grund, die Software zu schützen, wenn Sie keine webbasierte Lizenzierung verwenden. Mit den Kopfschmerzen, die DRM verursachen kann, ist es nicht fair gegenüber den Benutzern, die tatsächlich dafür bezahlt haben.

4
jugg1es

Wie einige andere erwähnt, bin ich ein großer Gegner der Kundenfeindlichkeit - etwas, wofür die Lizenzbranche berüchtigt ist. Ich werde daher auf eine gute Lösung für Ihr Problem eingehen, 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 auf "Upgrade" umzustellen. Was Sie also suchen, sind Feature-Lizenzen für Ihr Produkt, z. Ein Kunde kann eine Lizenz für Feature-X oder Feature-Y erwerben.

Ich habe Keygen unter Berücksichtigung dieser Art der Lizenzierung erstellt. Keygen ist eine Lizenzierungs-API REST, mit der Sie Benutzerkonten und Lizenzen verwalten sowie die Computernutzung und -zuordnungen verfolgen können.

Was ich tun würde, ist 2 Lizenztypen (eine Richtlinie innerhalb von Keygen) einzurichten, wobei eine eine Basisrichtlinie für die eingeschränkte kostenlose Nutzung ist Version, und die andere ist eine Richtlinie 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 normal), das Webhooks bietet. 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 kommunizieren (denken Sie: customer.created -> Basislizenz für Kunden erstellen, license.created -> Kunden für die neue Lizenz belasten).

Durch den Einsatz 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 geschehen. Am häufigsten wird jedoch verlangt, dass Ihr Kunde einen langen Lizenzschlüssel in ein Eingabefeld eingibt, das Sie dann validieren können. Ich denke, dies ist eine schreckliche Möglichkeit, die Lizenzvalidierung in Ihrer Anwendung zu handhaben.

Warum denke ich das? Zunächst müssen Sie von Ihrem Kunden einen langwierigen Lizenzschlüssel eingeben, der für den Maschinenverbrauch bestimmt ist, und zweitens , dass 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: Ermöglichen, dass sie mit einer E-Mail/einem Passwort ein Konto für Ihr Produkt erstellen. Sie können dann alle Lizenzen und Computer mit diesem Konto verknüpfen. Anstatt einen Lizenzschlüssel einzugeben, können sie sich jetzt einfach mit ihren Anmeldeinformationen anmelden.

Welchen Vorteil bietet Ihnen das? Erstens müssen Sie und Ihre Kunden die Lizenzschlüssel nicht mehr nachverfolgen. da alles hinter den Kulissen in ihrem Benutzerkonto abgewickelt wird und vor allem: können Sie Ihren Kunden jetzt eine Selbstbedienungslizenz und eine Maschinenaktivierung anbieten! dh da alle ihre Lizenzen und Maschinen mit ihrem Benutzerkonto verknüpft sind, können Sie sie auffordern, eine Lizenz zu erwerben, wenn sie Ihre Anwendung auf einer nicht erkannten Maschine starten.

Nun zur Lizenzüberprüfung : Immer wenn sich Ihr Kunde mit seiner E-Mail-Adresse/seinem Passwort bei Ihrer Anwendung anmeldet, können Sie die Lizenzen, die er besitzt, von seinem Benutzerkonto abfragen lassen, um festzustellen, ob Sie können Feature-X oder Feature-Y verwenden. Und da Ihre Anwendung jetzt Self-Serve ist, können Sie Ihren Kunden erlauben, zusätzliche Funktionen direkt in Ihrer Anwendung zu erwerben!

Deshalb haben wir unser Lizenzierungssystem um eine Tonne Automatisierung erweitert. Wir können einzelne Funktionen lizenzieren (dh eine begrenzte Anzahl im Vergleich zur vollständigen Version) Version), haben wir unseren Kunden eine fantastische UX angeboten und auch einen der Hauptgründe für Supportanfragen beseitigt: Wiederherstellung von Lizenzschlüsseln .

Wie auch immer, das hat lange gedauert, aber hoffentlich hilft es jemandem!

3
ezekg

Ich bin einer der Entwickler hinter der Cryptolens Software-Lizenzplattform und arbeite seit dem Alter von 14 Jahren an Lizenzsystemen. In dieser Antwort habe ich einige auf der Grundlage der über die Jahre gesammelten Erfahrungen gebrachte Tipps gegeben.

Am besten lösen Sie dies, indem Sie einen Lizenzschlüssel-Server einrichten, den jede Instanz der Anwendung zur Überprüfung eines Lizenzschlüssels aufruft.

Vorteile eines Lizenzschlüssel-Servers

Die Vorteile eines Lizenzschlüsselservers sind:

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

Überlegungen

Die Online-Überprüfung von Lizenzen gibt Ihnen zwar mehr Kontrolle über jede Instanz der Anwendung. Die Internetverbindung ist jedoch nicht immer vorhanden (insbesondere, wenn Sie sich an größere Unternehmen richten). Daher benötigen Sie eine andere Möglichkeit zur Überprüfung des Lizenzschlüssels.

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

Falls keine Internetverbindung vorhanden ist, können Sie stattdessen die vorherige Antwort des Lizenzschlüssels verwenden. Stellen Sie sicher, dass Sie in der Antwort sowohl date als auch machine-bezeichner speichern und prüfen, ob sie nicht zu alt sind (z. B. Benutzer dürfen sich höchstens 30 Tage offline befinden usw.) und den Lizenzschlüssel Antwort gehört zum richtigen Gerät.

Hinweis Sie sollten das Zertifikat der Lizenzschlüsselantwort immer überprüfen, auch wenn Sie mit dem Internet verbunden sind), um sicherzustellen, dass es seit dem Verlassen des Servers nicht geändert wurde (dies muss auch getan werden, wenn) Ihre API für den Lizenzschlüssel-Server verwendet https)

Geheimalgorithmen schützen

Die meisten .NET-Anwendungen können relativ einfach rückgängig gemacht werden (es gibt sowohl einen von Microsoft bereitgestellten Diassembler, der den IL-Code abruft, und einige kommerzielle Produkte können sogar den Quellcode in C # abrufen). Natürlich können Sie den Code immer verschleiern, aber er ist niemals 100% sicher.

In den meisten Fällen besteht der Zweck einer Softwarelizenzierungslösung darin, ehrlichen Menschen zu helfen, die ehrlich sind (d. H. Dass ehrliche Benutzer, die bereit sind zu zahlen, nicht vergessen, nach Ablauf einer Testphase zu zahlen usw.).

Möglicherweise haben Sie jedoch noch einen Code, den Sie auf keinen Fall der Öffentlichkeit zugänglich machen möchten (z. B. ein Algorithmus zur Vorhersage der Aktienkurse usw.). In diesem Fall können Sie nur einen API-Endpunkt erstellen, den Ihre Anwendung bei jeder Ausführung der Methode aufruft. 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, einen Blick auf dieses Tutorial (Teil von Cryptolens ) zu werfen.

3
Artem

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

Eine gesperrte Lizenzierung für Knoten (Maschinen) ist am besten geeignet, wenn Sie die Wiederverwendung von Lizenzschlüsseln verhindern möchten. Ich benutze Cryptlex seit ungefähr einem Jahr für meine Software. Es hat auch einen free-Plan, wenn Sie also nicht zu viele Kunden erwarten, können Sie ihn kostenlos nutzen.

2
adnan kamili

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

In der Vergangenheit habe ich Treek's Licensing Library oft verwendet, weil es diese Anforderungen erfüllt und einen wirklich guten Preis bietet. Es verwendet den gleichen Lizenzschutz für Endbenutzer und sich selbst und niemand hat das bisher geknackt. Auf der Website finden Sie auch gute Tipps, um Piraterie und Rissbildung zu vermeiden.

2
panpernicek

Sie können eine kostenlose Drittanbieterlösung verwenden, um dies für Sie zu erledigen, wie z. B. Quantum-Key.Net. Es ist kostenlos und wickelt Zahlungen über Paypal über eine für Sie erstellte Web-Sales-Seite ab. Der Schlüssel wird per E-Mail ausgegeben und der Schlüssel wird an einen bestimmten Computer gesendet Piraterie verhindern. 

Sie sollten auch darauf achten, Ihren Code zu verschleiern/zu verschlüsseln, oder er kann mit Software wie De4dot und .NetReflector leicht rückentwickelt werden. Ein guter kostenloser Code-Verschleierer ist ConfuserEx, das schnell und einfach zu verwenden ist und effizienter ist als teure Alternativen. 

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 getan hätte, und um sicherzustellen, dass Sie keinen wichtigen Code offen gelassen haben oder nicht.

Ihre Software ist zwar immer noch knackbar, aber für den gelegentlichen Cracker reicht es möglicherweise aus, sie abzuschrecken, und diese einfachen Schritte verhindern auch, dass Ihr Code extrahiert und erneut verwendet wird.

https://quantum-key.net

Wie verwende ich ConfuserEx?

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

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

0
Damo