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:
- Wie ist das normalerweise gelöst?
- Wie kann ich den Schlüssel generieren und wie kann er von der Anwendung validiert werden?
- 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?
quelle
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:
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.
Ein Lizenzschlüssel sollte nur auf einem Computer verwendet werden können (oder zumindest sollten Sie dies sehr genau kontrollieren können).
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?
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 :))
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).
Entfernen Sie einfach redundante Zeichen wie "1", "l", "0", "o" aus Ihren Schlüsseln. Teilen Sie die Lizenzschlüsselzeichenfolge in Zeichengruppen auf.
quelle
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
quelle
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!
quelle
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.
quelle
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.
quelle
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:
Ü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.
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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!
quelle
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.
quelle
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
quelle